J'ai un certain nombre de fonctions qui renvoient quelque chose ou lancent une erreur. Dans une fonction principale, j'appelle chacune d'elles, et je voudrais retourner la valeur retournée par chaque fonction, ou passer à la deuxième fonction si la première fonction génère une erreur.
Donc, fondamentalement, ce que j'ai actuellement est:
function testAll() {
try { return func1(); } catch(e) {}
try { return func2(); } catch(e) {} // If func1 throws error, try func2
try { return func3(); } catch(e) {} // If func2 throws error, try func3
}
Mais en fait, j'aimerais seulement try
le renvoyer (c'est-à-dire s'il ne génère pas d'erreur). Je n'ai pas besoin du catch
bloc. Cependant, le code comme try {}
échoue car il manque un catch {}
bloc (inutilisé) .
J'ai mis un exemple sur jsFiddle .
Alors, y a-t-il un moyen de catch
supprimer ces blocs tout en obtenant le même effet?
la source
null
et vous faites quelque chose commereturn func1() || func2() || func3();
try {}; finally {}
comme indiqué dans stackoverflow.com/a/5764505/68210catch (e) {}
, l'exception lancée parfunc1()
empêcheraitfunc2()
d'être essayée.async
fonction, parfois. Être forcé par le langage javascript de créer descatch
blocs vides est clairement inutile.Un essai sans clause catch envoie son erreur à la capture supérieure suivante , ou à la fenêtre, si aucune capture n'est définie dans cet essai.
Si vous n'avez pas de catch , une expression try nécessite une clause finally .
la source
try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { //always run}}}
?Il est possible d'avoir un bloc catch vide, sans variable d'erreur, en commençant par ES2019 . Ceci est appelé liaison de capture facultative et a été implémenté dans la version V8 v6.6, publiée en juin 2018 . La fonctionnalité est disponible depuis Node 10 , Chrome 66 , Firefox 58 , Opera 53 et Safari 11.1 .
La syntaxe est indiquée ci-dessous:
Vous avez toujours besoin d'un
catch
bloc, mais il peut être vide et vous n'avez pas besoin de passer de variable. Si vous ne voulez pas du tout de bloc catch, vous pouvez utiliser letry
/finally
, mais notez qu'il n'avalera pas les erreurs comme le fait un catch vide.la source
try
blocage. 2. Attrape l'erreur. 3. Exécute lefinally
bloc. 4. Lève l'erreur. Est-ce correct?catch
). Entourez tout le code d'un autretry
/catch
et vous serez en mesure de détecter l'This WILL get logged
erreur.Non,
catch
(oufinally
) esttry
l'ami de et toujours là dans le cadre de try / catch .Cependant, il est parfaitement valable de les avoir vides, comme dans votre exemple.
Dans les commentaires de votre exemple de code ( si func1 génère une erreur, essayez func2 ), il semblerait que ce que vous voulez vraiment faire est d'appeler la fonction suivante à l'intérieur du
catch
bloc de la précédente.la source
try {...}; try {...}
était possible, la signification du code pourrait être plus claire (essayez le premier, sinon essayez le second).return
déclaration arrête quoi que ce soit après.return
provoquera le retour prématuré de la fonction. Je mettrai à jour ma réponse.try {}; finally {}
comme indiqué dans stackoverflow.com/a/5764505/68210finally{}
c'est fondamentalement dans le même esprit quecatch{}
. Je mettrai à jour la réponse.Je ne recommanderais pas try-finally sans le catch, car si le bloc try et le bloc finally lancent des erreurs, l'erreur levée dans la clause finally est remontée et l'erreur du bloc try est ignorée, dans mon propre test:
Résultat:
la source
Ils vont ensemble dans tous les langages que je connais qui les ont (JavaScript, Java, C #, C ++). Ne fais pas ça.
la source
catch {my code}
J'ai décidé de regarder le problème présenté sous un angle différent.
J'ai pu déterminer un moyen de permettre étroitement le modèle de code demandé tout en traitant en partie l'objet d'erreur non géré répertorié par un autre commentateur.
le code peut être vu @ http://jsfiddle.net/Abyssoft/RC7Nw/4/
try: catch est placé dans une boucle for permettant une chute gracieuse. tout en étant capable de parcourir toutes les fonctions nécessaires. lorsque la gestion des erreurs explicite est nécessaire, un tableau de fonctions supplémentaire est utilisé. dans le même cas d'erreur et tableau fonctionnel avec l'élément de gestionnaires d'erreur n'est pas une fonction, l'erreur est sauvegardée dans la console.
Selon les exigences de stackoverflow, voici le code en ligne [modifié pour rendre compatible JSLint (supprimer les espaces de début pour confirmer), améliorer la lisibilité]
la source
Si vous voulez que les fonctions 2 et 3 ne se déclenchent qu'en cas d'erreur, pourquoi ne les mettez-vous pas dans le bloc catch?
la source
Je pense que vous devez utiliser une fonction d'assistance comme:
et utilisez-le comme:
la source
try & catch sont comme les deux faces d'une pièce. donc pas possible sans essayer.
la source
try {}; finally {}
comme indiqué dans stackoverflow.com/a/5764505/68210Depuis ES2019, vous pouvez facilement utiliser
try {}
sanscatch {}
:Pour plus d'informations, veuillez vous référer à la proposition de Michael Ficcara
la source
catch
c'est toujours nécessaire, c'est juste la liaison qui n'est pas requise ...