AngularJS - Verspricht rethrow gefangen Ausnahmen
In dem folgenden code, der eine Ausnahme abgefangen wird, indem der fangen Funktion der $q-Versprechen:
//Fiddle - http://jsfiddle.net/EFpn8/6/
f1().then(function(data) {
console.log("success 1: "+data)
return f2();
})
.then(function(data) {console.log("success 2: "+data)})
.catch(function(data) {console.log("error: "+data)});
function f1() {
var deferred = $q.defer();
//An exception thrown here is not caught in catch
//throw "err";
deferred.resolve("done f1");
return deferred.promise;
}
function f2() {
var deferred = $q.defer();
//An exception thrown here is handled properly
throw "err";
deferred.resolve("done f2");
return deferred.promise;
}
Aber wenn ich mir in der Konsole die log-Ausgabe sehe ich Folgendes:
Ausnahme gefangen wurde, in Winkel, war aber auch gefangen von der Fehlerbehandlung der browser. Dieses Verhalten reproduziert mit Q-Bibliothek.
Ist es ein bug? Wie kann ich wirklich abfangen einer Ausnahme mit $q?
InformationsquelleAutor VitalyB | 2014-04-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fest mit AngularJS in der version 1.6
Die Begründung für dieses Verhalten war, dass eine nicht abgefangene Fehler ist anders als ein normales Ablehnung, wie
es kann verursacht werden durch einen Fehler bei der Programmierung, zum Beispiel. In der Praxis stellte sich heraus, um verwirrend zu sein
oder unerwünscht für den Benutzer, da weder native verspricht noch alle anderen gängigen Versprechen der Bibliothek
unterscheidet geworfen Fehler von regelmäßigen Ablehnungen.
(Hinweis: Während dieses Verhalten nicht gegen die Promises/A+ - Spezifikation, es ist nicht vorgeschrieben.)
unhandledrejection
undrejectionhandled
Veranstaltungen?InformationsquelleAutor georgeawg
Eckig ist
$q
verwendet die Konvention, wo geworfen werden Fehler protokolliert unabhängig erwischt zu werden. Stattdessen, wenn Sie möchten, um zu signalisieren Ablehnung, die Sie brauchen, umreturn $q.reject(...
als solche:Dies ist zu unterscheiden Ablehnungen von Fehlern wie SyntaxError. Persönlich, es ist eine Wahl, die ich nicht einverstanden mit, aber es ist verständlich, da
$q
ist winzig, also kann man nicht wirklich bauen, in eine zuverlässige unbehandelte Ablehnung Mechanismus zur Erkennung. Bei stärkeren Bibliotheken, wie Bluebird, diese Art der Sache ist nicht erforderlich.Als seitliche Anmerkung - nie, nie werfen Saiten : vermissen Sie auf die stack-traces, Weg.
offensichtlich code nicht aufgerufen werden, nach einer
throw
oderreturn
alle beteiligten sind sich bewusst, dass. Der code in dieser Antwort repliziert wird, von der Frage - OP gefragt, wie signalfehler, das ist, wie Sie es tun (sehen Sie, wie in dieser Antwortreturn $q.reject
ersetzt diethrow "foo"
in der exakt gleichen Umgebung code in OP ' s Frage. Bitte erwägen Sie, einen anderen Blick auf OP-code.Ich weiß das, aber jemand denken, die nicht wissen, diese Tatsache. Ich ziehe es nicht kopieren und einfügen falscher code, wenn ich sehe, dass es einen möglichen Fehler. Sie gab den Rat, nicht zu werfen Streicher auch. Dies ist etwas, das würde ich auch denken, VitalyB ist sich bewusst, wenn er schreibt solche Schmuddel-code ;-).
Ich bevorzuge Menschen, die nicht copy/paste-code, den ich hier posten blind und tatsächlich versuchen zu Lesen und zu verstehen und dann anwenden der Prinzipien, die ich diskutieren in ihm selbst.
In diesem Beispiel werden nur verwirrt mich noch mehr. Es enthält mehrere gibt und verwirrend Kommentare. "Eine Ausnahme geworfen hier...". Was Ausnahme? Nur die "throw" - Anweisung in diesem code ist auskommentiert.
InformationsquelleAutor Benjamin Gruenbaum
Nicht. Suche in der Quelle für die $q zeigt, dass eine bewusste try /catch-block wird erstellt, um reagieren zu Ausnahmen, die in den Rückruf von
deferred.reject
Zu klären, hat die Ausnahme nicht behandelt direkt durch den browser, sondern erscheint als ein Fehler, weil Eckige genannt hat
console.error
Rückrufe werden ausgeführt, einige Zeit später, als die aktuellen call-stack gelöscht, so dass Sie nicht in der Lage, wickeln Sie die äußere Funktion in
try
/catch
block. Allerdings haben Sie 2 Möglichkeiten:Setzen in
try
/catch
- block, um den code, der möglicherweise die Ausnahmen, innerhalb des callback:Ändern, wie Eckig die
$exceptionHandler
service verhält, wie bei Gewusst wie: überschreiben $exceptionHandler Umsetzung . Sie könnten es ändern, absolut nichts zu tun, so würde es nie etwas in der Konsole ein error-log, aber ich glaube nicht, dass ich würde empfehlen, dass.InformationsquelleAutor Michal Charemza
Die latente ist eine veraltete und eine wirklich schreckliche Art und Weise zu konstruieren verspricht, mit der Konstruktor löst dieses problem und mehr:
Ich weiß nicht, ob eckig, verspricht die Unterstützung der oben genannten, wenn nicht, können Sie dies tun:
Verwendung ist die gleiche wie Versprechen Konstruktor:
In der Tat. Dies ist das erste mal, dass ich höre, dass. Eckig $q-Dokumentation angegeben latente...
Ich wollte nicht buchstäblich als veraltet markiert durch eckige gibt es einige synonym, die ich verwenden kann
Veraltet? Ersetzt durch das Versprechen Konstruktor?
veraltet ist gut
InformationsquelleAutor Esailija
Hier ist ein Beispiel-test zeigt, dass die neue $q Konstruktion, Funktion, Verwendung .endlich(), absagen und Versprechen Kette Ausbreitungen:
InformationsquelleAutor user2747330