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 ?

325voto

kennebec Points 33886

A essayer sans attraper envoie son erreur à la clause supérieure suivante attraper ou la fenêtre, s'il n'y a pas de catch défini dans ce try.

Si vous n'avez pas de attraper , une expression try nécessite un enfin clause.

try {
    // whatever;
} finally {
    // always runs
}

120voto

Dan Dascalescu Points 8165

Il est possible d'avoir un bloc catch vide, sans variable d'erreur, commençant par ES2019 . C'est ce qu'on appelle fixation de l'arrêt en option et a été mis en œuvre en V8 v6.6, publié en juin 2018 . Cette fonction est disponible depuis le Nœud 10 , Chrome 66 , Firefox 58 , Opéra 53 et Safari 11.1 .

La syntaxe est présentée ci-dessous :

try {
  throw new Error("This won't show anything");
} catch { };

Vous avez toujours besoin d'un catch mais il peut être vide et vous n'avez pas besoin de passer de variable. Si vous ne voulez pas de bloc catch du tout, vous pouvez utiliser la méthode try / finally mais notez qu'il n'engloutira pas les erreurs comme le fait un catch vide.

try {
  throw new Error("This WILL get logged");
} finally {
  console.log("This syntax does not swallow errors");
}

14voto

alex Points 186293

Non, catch (o finally ) est try Il est toujours présent en tant qu'ami de l'homme et fait partie de l'équipe de la try/catch .

Cependant, il est tout à fait possible de les laisser vides, comme dans votre exemple.

Dans les commentaires de votre code d'exemple ( 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 de l'élément catch du bloc précédent.

12voto

Joe B. Points 753

Je ne recommanderais pas try-finally sans catch, parce que si le bloc try et le bloc finally lancent tous deux des erreurs, l'erreur lancée dans la clause finally est amplifiée et l'erreur du bloc try est ignorée, dans mon propre test :

try {
  console.log('about to error, guys!');
  throw new Error('eat me!');
} finally {
  console.log ('finally, who cares');
  throw new Error('finally error');
}

Résultat :

>     about to error, guys!
>     finally, who cares
>     .../error.js:9
>         throw new Error('finally error');
>         ^
>     
>     Error: finally error

5voto

Itay Merchav Points 1

Non, il n'est pas possible d'avoir essayer bloc sans attraper (o enfin ). En guise de solution de contournement, je pense que vous pourriez définir une fonction d'aide telle que celle-ci :

function tryIt(fn, ...args) {
    try {
        return fn(...args);
    } catch {}
}

et l'utiliser comme :

tryIt(function1, /* args if any */);
tryIt(function2, /* args if any */);

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