wake-up-neo.com

versuchen {} ohne catch {} in JavaScript möglich?

Ich habe eine Reihe von Funktionen, die entweder etwas zurückgeben oder einen Fehler auslösen. In einer Hauptfunktion rufe ich jede davon auf und möchte den von jeder Funktion zurückgegebenen Wert zurückgeben oder mit der zweiten Funktion fortfahren, wenn die erste Funktion einen Fehler auslöst.

Im Grunde habe ich im Moment:

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
}

Aber eigentlich möchte ich nur try zurückgeben (d. H. Wenn kein Fehler ausgegeben wird). Ich brauche den catch-Block nicht. Code wie try {} schlägt jedoch fehl, da ein (nicht verwendeter) catch {}-Block fehlt.

Ich habe ein Beispiel für jsFiddle .

Gibt es eine Möglichkeit, diese catch-Blöcke mit demselben Effekt zu entfernen?

76
pimvdb

Nein, du musst sie behalten.

Das macht tatsächlich Sinn, da Fehler überhaupt nicht ignoriert werden sollten.

19
ThiefMaster

Eine try ohne eine catch - Klausel sendet ihren Fehler an die nächsthöhere catch oder das Fenster, wenn in diesem try kein catch definiert ist.

Wenn Sie kein catch haben, erfordert ein try-Ausdruck eine finally -Klausel.

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

Nein, catch (oder finally) ist trys Freund und immer als Teil von try/catch da.

Es ist jedoch durchaus zulässig, sie leer zu haben, wie in Ihrem Beispiel.

In den Kommentaren in Ihrem Beispielcode ( Wenn func1 einen Fehler auslöst, versuchen Sie func2 ), scheint es, als würden Sie wirklich die nächste Funktion innerhalb des catch-Blocks des vorherigen aufrufen.

11
alex

Es ist möglich, einen leeren catch-Block ohne eine Fehlervariable zu haben, beginnend mit ES2019 . Dies wird optionales Catch Binding genannt und wurde in V8 v6.6, veröffentlicht im Juni 2018 implementiert. Die Funktion ist verfügbar seit Knoten 10 , Chrome 66, Firefox 58 , Opera 53 und Safari 11.1 .

Die Syntax ist unten gezeigt:

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

Sie benötigen weiterhin einen catch -Block, der jedoch leer sein kann und keine Variable übergeben muss. Wenn Sie überhaupt keinen catch-Block möchten, können Sie try/finally verwenden. Beachten Sie jedoch, dass Fehler nicht verschluckt werden, wie dies bei einem leeren catch der Fall ist.

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

Sie passen in jeder Sprache zusammen, die ich kenne (JavaScript, Java, C #, C++). Tu es nicht.

2
duffymo

Wenn Sie möchten, dass die Funktionen 2 und 3 nur ausgelöst werden, wenn ein Fehler auftritt, warum setzen Sie sie nicht in den catch-Block ein?

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

Ich habe mich entschieden, das Problem aus einem anderen Blickwinkel zu betrachten.

Ich konnte einen Weg finden, um das angeforderte Codemuster genau zu berücksichtigen, während das nicht behandelte Fehlerobjekt teilweise von einem anderen Kommentator aufgelistet wird.

code kann @ http://jsfiddle.net/Abyssoft/RC7Nw/4/ gesehen werden

try: catch wird in eine for-Schleife eingefügt, die einen graziösen Fall ermöglicht. während Sie alle erforderlichen Funktionen durchlaufen können. Wenn eine explizite Fehlerbehandlung erforderlich ist, wird ein zusätzliches Funktionsarray verwendet. im Fehler- und Funktionsbereich mit Fehlerbehandlungselementen ist keine Funktion, wird der Fehler an die Konsole ausgegeben.

Gemäß den Anforderungen von stackoverflow ist hier der Code inline [bearbeitet, um JSLint-kompatibel zu machen (führende Leerzeichen entfernen), Lesbarkeit verbessern

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], [], []));

Das

2
user1800957

Ich würde try-finally ohne catch nicht empfehlen, denn wenn sowohl der try-Block als auch der finalen Wurffehler blockiert wird, wird der in der finally-Klausel geworfene Fehler gesprudelt und der Fehler des try-Blocks wird in meinem eigenen Test ignoriert:

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

Ergebnis:

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

Seit ES2019 können Sie try {} problemlos ohne catch {} verwenden:

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

Für weitere Informationen wenden Sie sich bitte an Michael Ficcaras Vorschlag

0
JamesJGoodwin

try & catch sind wie 2 Seiten einer Münze. also ohne probieren nicht möglich.

0