Wie kann ich eine Ausnahme in Javascript erneut auslösen, aber den Stapel beibehalten?
In Javascript, angenommen, ich möchte etwas Aufräumen, wenn eine Ausnahme passiert, aber lassen Sie die exception weiter zu verbreiten, bis der stack, zB:
try {
enterAwesomeMode();
doRiskyStuff(); //might throw an exception
} catch (e) {
leaveAwesomeMode();
throw e;
}
doMoreStuff();
leaveAwesomeMode();
Das problem bei diesem code ist, dass das fangen und erneute auslösen der exception bewirkt, dass der stack trace-Informationen bis zu diesem Punkt verloren zu werden, so dass, wenn die exception wird anschließend wieder gefangen, weiter oben auf dem stack, der stack-trace geht nur nach unten, um die re-throw. Das nervt, weil es bedeutet, es enthält nicht die Funktion, die eigentlich die Ausnahme ausgelöst hat.
Als es stellt sich heraus, try..finally hat das gleiche Verhalten zumindest in Chrome (das heißt, es ist nicht die re-werfen, ist das problem genau, aber die Anwesenheit von einem exception-handler-block.)
Kennt jemand einen Weg, um rethrow eine Ausnahme im Javascript, aber bewahren Sie die Stapel-Ablaufverfolgung zugeordnet? Gelingt das nicht, wie über Vorschläge für weitere Möglichkeiten zum hinzufügen von Ausnahme-safe-cleanup-Handler, während auch die Erfassung kompletter stack-traces, wenn eine Ausnahme passiert?
Vielen Dank für jegliche Hinweise 🙂
InformationsquelleAutor der Frage Geoff | 2010-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein bug in Chrom. Erneute auslösen einer exception sollte erhalten die call-trace.
http://code.google.com/p/chromium/issues/detail?id=60240
Ich kenne keine Abhilfe.
Sehe ich nicht das problem mit schließlich. Ich sehe Ausnahmen leise nicht zeigen, bis auf der Fehler-Konsole in einigen Fällen nach ein schließlich, aber das scheint behoben zu sein in der Entwicklung baut.
InformationsquelleAutor der Antwort Glenn Maynard
Stapel-Eigenschaft eines Error-Objekt erstellt in der gleichen Zeit wie das Error-Objekt selbst, nicht auf den Punkt geworfen wird. Sie sind Häufig die gleichen, weil das idiom
und wenn du den code wie du geschrieben hast, der stack-Eigenschaft wird nicht geändert werden, wenn Sie rethrow der Fehler.
InformationsquelleAutor der Antwort Mike Stay