176 votes

Est-ce que try {} sans catch {} est possible en JavaScript ?

J'ai un certain nombre de fonctions qui renvoient quelque chose ou lancent une erreur. Dans une fonction principale, j'appelle chacune d'entre elles et j'aimerais renvoyer la valeur renvoyée par chaque fonction, ou passer à la deuxième fonction si la première fonction renvoie une erreur.

En gros, ce que j'ai actuellement, c'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, je voudrais seulement try pour le renvoyer (c'est-à-dire s'il n'envoie pas d'erreur). Je n'ai pas besoin de la fonction catch bloc. Cependant, un code comme try {} échoue parce qu'il lui manque un (inutilisé) catch {} bloc.

Je mets un exemple sur jsFiddle .

Existe-t-il donc un moyen de faire en sorte que ces catch Les blocs d'acier peuvent-ils être enlevés tout en conservant le même effet ?

2voto

Tank Points 29

Si vous ne voulez que les fonctions 2 et 3 soient déclenchées en cas d'erreur, pourquoi ne les mettez-vous pas dans le bloc catch ?

function testAll() {
  try {
    return func1();
  } catch(e) {
    try {
      return func2();
    } catch(e) {
      try {
        return func3();
      } catch(e) {
        // LOG EVERYTHING FAILED
      }
    }
  }
}

2voto

Air Points 190

...is there any way to have those catch blocks removed whilst achieving the same effect? Il semblerait que ce soit le cas, no Javascript exige qu'un bloc try soit suivi d'un bloc catch ou finally.

Cela dit, il existe un moyen de utiliser ces blocs de capture pour obtenir l'effet désiré.

// If func1 throws error, try func2 Le si lance une erreur est la raison d'être du bloc de capture.

Pourquoi les supprimer alors que leur utilisation correspond exactement à ce que vous recherchez ?

try { return func1(); }
catch {
   // if func1 throws error
   try { return func2(); } 
   catch {
      // if func2 throws error
      try { return func3(); } 
      catch {
         // if func3 throws error
      }
   }
}

Je comprends parfaitement pourquoi vous n'avez pas besoin d'un bloc de capture, et je trouverais plus propre de pouvoir l'omettre complètement. Mais je ne pense pas que ce soit le cas ici.

0voto

duffymo Points 188155

Ils vont ensemble dans tous les langages que je connais et qui les possèdent (JavaScript, Java, C#, C++). Ne le faites pas.

-4voto

JamesJGoodwin Points 226

Depuis ES2019 vous pouvez facilement utiliser try {} sans catch {} :

try {
  parseResult = JSON.parse(potentiallyMalformedJSON);
} catch (unused) {}

Pour plus d'informations, veuillez vous référer à Proposition de Michael Ficcara

-5voto

Hitesh Prajapati Points 569

Essayer et attraper sont comme les deux faces d'une même pièce de monnaie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X