Abfangen von Fehlern in JavaScript Verspricht mit einer Ersten Stufe try ... catch
So, ich möchte meinen ersten level fangen zu sein, die Griffe der Fehler. Gibt es trotzdem zu propagieren, mein Fehler bis auf die ersten fangen?
Referenz-code, funktioniert nicht (noch nicht):
Promise = require('./framework/libraries/bluebird.js');
function promise() {
var promise = new Promise(function(resolve, reject) {
throw('Oh no!');
});
promise.catch(function(error) {
throw(error);
});
}
try {
promise();
}
//I WANT THIS CATCH TO CATCH THE ERROR THROWN IN THE PROMISE
catch(error) {
console.log('Caught!', error);
}
InformationsquelleAutor der Frage Kirk Ouimet | 2014-07-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit der neuen async/await syntax Sie diese erreichen können. Bitte beachten Sie, dass im moment des Schreibens dieses ist nicht von allen Browsern unterstützt wird, müssen Sie wahrscheinlich zu transpile Ihren code mit babel (oder so ähnlich).
InformationsquelleAutor der Antwort Edo
Können Sie nicht mit try-catch-Anweisungen, die Ausnahmen behandeln asynchron ausgelöst, da die Funktion "zurückgegeben" werden, bevor eine Ausnahme ausgelöst wird. Sollten Sie stattdessen den
promise.then
undpromise.catch
Methoden, die für die asynchrone entspricht der try-catch-Anweisung.Was Sie tun müssen, ist die Rückgabe das Versprechen, dann Kette ein weiteres
.catch
:Versprechen verkettbare, so dass, wenn ein Versprechen rethrows ein Fehler, es wird delegiert an die nächste
.catch
.Durch die Art und Weise, die Sie nicht brauchen, um verwenden Sie Klammern, um
throw
Aussagen (throw a
ist das gleiche wiethrow(a)
).Wenn Sie diesen code ausführen in Node.js und für einige Grund, Sie sind nicht erlaubt zu Bearbeiten, die
promise
- Funktion, können Sie mit domains zu tun. Beachten Sie, dass die domains sind nicht gerade die einfachsten Dinge zu erledigen und haben einige lästige Rand-Fällen in bestimmten Umständen. Es sei denn, Sie haben wirklich, ich würde empfehlen, mit Versprechen statt.InformationsquelleAutor der Antwort Qantas 94 Heavy
Nein! Das ist völlig unmöglich, wie Versprechungen sind inhärent asynchron. Die try-catch-Klausel beendet die Ausführung, wenn die exception geworfen wird (und Zeitreisen noch nicht erfunden wurden).
Stattdessen Rückkehr verspricht, alle Ihre Funktionen, und Haken, einen Fehler-handler auf.
InformationsquelleAutor der Antwort Bergi
Oft finde ich die Notwendigkeit ein Versprechen zurückgegeben und fast genauso oft benötigt, um zu behandeln, einen lokalen Fehler und dann Optional rethrow.
Der Vorteil dieser Methode (Versprechen.try/catch) ist, dass Sie beginnen/Gewährleistung ein Versprechen Kette ohne die resolve/ablehnen eine Anforderung, die leicht übersehen werden, und erstellen Sie eine debugging-Alptraum.
InformationsquelleAutor der Antwort kingdango
Erweitern edo's Antwort, wenn Sie wollen, fangen die Fehler an eine asynchrone Funktion, die Sie nicht wollen, zu warten. Sie können hinzufügen, ein await-Anweisung am Ende der Funktion.
Wenn
someAsyncAction
fehlschlägt, wird der catch-Anweisung verarbeitet wird.InformationsquelleAutor der Antwort GreenGremlin