Angenommen, ich möchte in Javascript eine Bereinigung durchführen, wenn eine Ausnahme auftritt, aber die Ausnahme den Stapel weiter verbreiten, z.
try {
enterAwesomeMode();
doRiskyStuff(); // might throw an exception
} catch (e) {
leaveAwesomeMode();
throw e;
}
doMoreStuff();
leaveAwesomeMode();
Das Problem mit diesem Code besteht darin, dass das Abfangen und erneute Auslösen der Ausnahme dazu führt, dass die Stack-Trace-Informationen bis zu diesem Punkt verloren gehen. Wenn die Ausnahme anschließend weiter oben im Stack erneut abgefangen wird, geht der Stack-Trace nur bis zum erneuten Wert zurück -werfen. Das ist scheiße, weil es bedeutet, dass es nicht die Funktion enthält, die die Ausnahme tatsächlich ausgelöst hat.
Wie sich herausstellt, hat try..finally das gleiche Verhalten, zumindest in Chrome (das heißt, es ist nicht genau das erneute Werfen, das genau das Problem ist, sondern das Vorhandensein eines Ausnahmebehandlungsblocks überhaupt.)
Kennt jemand eine Möglichkeit, eine Ausnahme in Javascript erneut auszulösen, aber die damit verbundene Stapelverfolgung beizubehalten? Wenn dies nicht der Fall ist, wie wäre es mit Vorschlägen für andere Möglichkeiten, um ausnahmesichere Bereinigungshandler hinzuzufügen und gleichzeitig vollständige Stapelspuren zu erfassen, wenn eine Ausnahme auftritt?
Danke für alle Hinweise :)