Ich habe eine Reihe von Funktionen, die entweder etwas zurückgeben oder einen Fehler auslösen. In einer Hauptfunktion rufe ich jede dieser Funktionen 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 derzeit also Folgendes:
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 es nur try
zurückgeben (dh wenn es keinen Fehler auslöst). Ich brauche den catch
Block nicht. Code wie try {}
schlägt jedoch fehl, weil ein (nicht verwendeter) catch {}
Block fehlt .
Ich habe jsFiddle ein Beispiel gegeben .
Gibt es also eine Möglichkeit, diese catch
Blöcke zu entfernen, während der gleiche Effekt erzielt wird?
quelle
null
return func1() || func2() || func3();
try {}; finally {}
wie in stackoverflow.com/a/5764505/68210catch (e) {}
ausgelöste Ausnahmefunc1()
verhindern,func2()
dass versucht wird.async
manchmal sinnvoll ist, keinen Catch-Block zu haben, wie in einer Funktion. Escatch
ist eindeutig sinnlos, von der Javascript-Sprache gezwungen zu werden, leere Blöcke zu erstellen .Ein Versuch ohne catch- Klausel sendet seinen Fehler an den nächsthöheren catch oder an das Fenster, wenn in diesem try kein catch definiert ist.
Wenn Sie keinen Haken haben , erfordert ein try-Ausdruck eine finally- Klausel.
quelle
try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { //always run}}}
?Es ist möglich, einen leeren catch-Block ohne Fehlervariable zu haben, beginnend mit ES2019 . Dies wird als optionale Fangbindung bezeichnet und wurde in V8 v6.6 implementiert , das im Juni 2018 veröffentlicht wurde . Die Funktion ist seit Node 10 , Chrome 66 , Firefox 58 , Opera 53 und Safari 11.1 verfügbar .
Die Syntax ist unten dargestellt:
Sie benötigen noch einen
catch
Block, dieser kann jedoch leer sein und Sie müssen keine Variable übergeben. Wenn Sie überhaupt keinen catch-Block möchten, können Sie dastry
/ verwendenfinally
. Beachten Sie jedoch, dass es keine Fehler verschluckt, wie dies bei einem leeren catch der Fall ist.quelle
try
Block. 2. Fängt den Fehler ab. 3. Führt denfinally
Block aus. 4. Wirft den Fehler. Ist das richtig?catch
). Umgeben Sie den gesamten Code mit einem anderentry
/catch
und Sie können denThis WILL get logged
Fehler abfangen .Nein,
catch
(oderfinally
) isttry
ein Freund und immer da als Teil von try / catch .Es ist jedoch durchaus gültig, sie leer zu lassen, wie in Ihrem Beispiel.
In den Kommentaren in Ihrem Beispielcode ( Wenn func1 einen Fehler auslöst, versuchen Sie es mit func2 ) scheint es, dass Sie wirklich die nächste Funktion innerhalb des
catch
Blocks des vorherigen aufrufen möchten .quelle
try {...}; try {...}
möglich möglich wäre, könnte die Bedeutung des Codes klarer sein (versuchen Sie es mit dem ersten, andernfalls versuchen Sie es mit dem zweiten).return
Aussage verhindert, dass etwas danach kommt.return
bewirkt, dass die Funktion vorzeitig zurückkehrt. Ich werde meine Antwort aktualisieren.try {}; finally {}
wie in stackoverflow.com/a/5764505/68210finally{}
im Grunde im gleichen Sinne wiecatch{}
. Ich werde die Antwort aktualisieren.Ich würde try-finally ohne den catch nicht empfehlen, denn wenn sowohl der try-Block als auch der finally-Block einen Fehler auslösen, wird der in der finally-Klausel ausgelöste Fehler in die Luft gesprudelt und der Fehler des try-Blocks wird in meinem eigenen Test ignoriert:
Ergebnis:
quelle
Sie passen in jeder Sprache zusammen, von der ich weiß, dass sie sie haben (JavaScript, Java, C #, C ++). Tu es nicht.
quelle
catch {my code}
Ich habe beschlossen, das Problem aus einem anderen Blickwinkel zu betrachten.
Ich konnte einen Weg finden, um das angeforderte Codemuster genau zu berücksichtigen, während ich teilweise das nicht behandelte Fehlerobjekt adressierte, das von einem anderen Kommentator aufgelistet wurde.
Code kann unter http://jsfiddle.net/Abyssoft/RC7Nw/4/ eingesehen werden.
try: catch befindet sich in einer for-Schleife, die ein elegantes Durchfallen ermöglicht. während Sie in der Lage sind, alle benötigten Funktionen zu durchlaufen. Wenn eine explizite Fehlerbehandlung erforderlich ist, wird ein zusätzliches Funktionsarray verwendet. In der geraden Fehler- und Funktionsanordnung mit Fehlerbehandlungselement ist das Element keine Funktion, der Fehler wird an die Konsole ausgegeben.
Gemäß den Anforderungen des Stackoverflow ist hier der Code inline [bearbeitet, um JSLint-kompatibel zu machen (zur Bestätigung führende Leerzeichen entfernen), Lesbarkeit verbessern]
Wenn Sie
quelle
Wenn Sie nur möchten, dass die Funktionen 2 und 3 ausgelöst werden, wenn ein Fehler auftritt, warum setzen Sie sie nicht in den catch-Block?
quelle
Ich glaube, Sie müssen die Hilfsfunktion verwenden wie:
und benutze es wie:
quelle
Try & Catch sind wie 2 Seiten einer Münze. also nicht ohne versuch möglich.
quelle
try {}; finally {}
wie in stackoverflow.com/a/5764505/68210Seit ES2019 können Sie problemlos verwenden
try {}
ohnecatch {}
:Für weitere Informationen wenden Sie sich bitte an den Vorschlag von Michael Ficcara
quelle
catch
ist immer noch erforderlich, es ist nur die Bindung, die nicht erforderlich ist ...