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

Schreibe einen Kommentar