web-dev-qa-db-fra.com

essayer {} sans attraper {} possible en JavaScript?

J'ai un certain nombre de fonctions qui retournent quelque chose ou génèrent une erreur. Dans une fonction principale, j'appelle chacun de ces éléments et souhaite renvoyer la valeur renvoyé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 réalité, je voudrais seulement try le renvoyer (c'est-à-dire s'il ne génère pas d'erreur). Je n'ai pas besoin du bloc catch. Cependant, un code comme try {} échoue car il manque un bloc catch {} (non utilisé).

Je mets un exemple sur jsFiddle .

Alors, y a-t-il un moyen de supprimer ces blocs catch tout en obtenant le même effet?

76
pimvdb

Non, vous devez les garder.

Cela a du sens puisque les erreurs ne doivent pas du tout être ignorées en silence.

19
ThiefMaster

Une clause try sans catch envoie son erreur à la suivante catch , ou à la fenêtre, si aucune capture n'est définie dans cette tentative.

Si vous n'avez pas de catch , une expression try nécessite une clause finally .

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

Nope, catch (ou finally) est l'ami de try et est toujours présent dans le cadre de try/catch.

Cependant, il est parfaitement valide 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 vous souhaitiez réellement appeler la fonction suivante dans le bloc catch du précédent.

11
alex

Il est possible d'avoir un bloc catch vide, sans variable d'erreur, commençant par ES2019 . Ceci s'appelle liaison de capture optionnelle et a été implémenté dans V8 v6.6, publié en juin 2018 . La fonctionnalité est disponible depuis nœud 10 , Chrome 66, Firefox 58 , Opera 53 et Safari 11.1 .

La syntaxe est indiquée ci-dessous:

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

Vous avez toujours besoin d'un bloc catch, mais il peut être vide et vous n'avez pas besoin de passer de variable. Si vous ne voulez pas du tout bloquer un bloc, vous pouvez utiliser le try/finally, mais notez qu'il n'enlèvera pas les erreurs comme le ferait un crochet vide.

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

Ils vont ensemble dans toutes les langues que je connais qui les a (JavaScript, Java, C #, C++). Ne le fais pas.

2
duffymo

Si vous souhaitez uniquement que les fonctions 2 et 3 se déclenchent 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
      }
    }
  }
}
2
Tank

J'ai décidé de regarder le problème présenté sous un angle différent.

J'ai été en mesure de déterminer un moyen d'autoriser étroitement le motif de code demandé tout en adressant en partie l'objet d'erreur non traité répertorié par un autre intervenant.

le code peut être vu @ http://jsfiddle.net/Abyssoft/RC7Nw/4/

try: catch est placé dans une boucle for permettant une chute en douceur. tout en pouvant parcourir toutes les fonctions nécessaires. lorsque le traitement d'erreur explicite est nécessaire, un tableau de fonctions supplémentaire est utilisé. en cas d'erreur et que le tableau fonctionnel avec le gestionnaire d'erreur ne soit pas une fonction, l'erreur est transférée à la console.

Le code en ligne est conforme aux exigences de stackoverflow [modifié pour rendre JSLint conforme (supprimer les espaces de début pour confirmer), améliorer la lisibilité]

function func1() {"use strict"; throw "I don't return anything"; }
function func2() {"use strict"; return 123; }
function func3() {"use strict"; throw "I don't return anything"; }

// ctr = Code to Run <array>, values = values <array>, 
// eh = error code can be blank.
// ctr and params should match 1 <-> 1
// Data validation not done here simple POC
function testAll(ctr, values, eh) {
    "use strict";
    var cb; // cb = code block counter
    for (cb in ctr) {
        if (ctr.hasOwnProperty(cb)) {
            try {
                return ctr[cb](values[cb]);
            } catch (e) {
                if (typeof eh[cb] === "function") {
                    eh[cb](e);
                } else {
                    //error intentionally/accidentially ignored
                    console.log(e);
                }
            }
        }
    }
    return false;
}

window.alert(testAll([func1, func2, func3], [], []));

Le plus grand centre commercial

2
user1800957

Je ne recommanderais pas try-finally sans catch, car si les erreurs try bloquent et enfin bloquent, l'erreur renvoyée dans la clause finally est propagé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
1
Joe B.

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

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

Pour plus d'informations, merci de vous référer à La proposition de Michael Ficcara

0
JamesJGoodwin

essayer et attraper sont comme 2 faces d'une pièce. donc pas possible sans essayer.

0
Hitesh Prajapati