Wie funktioniert "try / catch" im Detail?
Ich möchte zu den Innereien wie gehttry {} catch {}
Block- und Stapelspuren funktionieren.
ich habe gelesenDieser großartige Artikel über die Ausnahmebehandlung von Anti-Mustern und fand den folgenden Absatz:
catch (NoSuchMethodException e) {
throw new MyServiceException("Blah: " +
e.getMessage());
}
Dies zerstört den Stack-Trace der ursprünglichen Ausnahme und ist immer falsch.
Danach wurde mir klar, dass ich es nicht tueJa wirklich Fachwissentry/catch
funktioniert. Mein Verständnis ist das folgende. Betrachten Sie das Beispiel:
void top() {
try {
f();
} catch (MyException ex) {
handleIt();
} finally {
cleanup();
}
}
void f() {
g();
}
void g() {
throw new MyException();
}
Wenn ich anrufetop()
, die Rufkettetop -> f -> g
lässt zweiStapelrahmen auf dem Callstack (ztop
undf
funktionen). Wenn die Ausnahme in ausgelöst wirdg
sprudelt das Programm in den Ausführungsstapel, bis es ihn findettry/catch
Block, der die Ausnahme behandelt. In der Zwischenzeit werden die Stack-Frames freigegeben und Stack-Trace-Informationen an ein "magisches" Objekt angehängt, an das übergeben werden kanncatch
und die Stapelverfolgung kann gedruckt werden.
Woher weiß es, dass die aufgerufene Funktion vom try / catch-Block "umgeben" ist? Sind diese Informationen an den Stack-Frame gebunden? Wie ein Zeiger auf einen Fehlerbehandlungsblock (einige Schalter wählen eine Übereinstimmung aus)catch
Block) und ein Zeiger auffinally
Block? Warume.getMessage()
ist destruktiv im obigen Beispiel (siehe die Kommentare)?
Beachten Sie, ichkennt Wie benutzt man try / catch und Ausnahmen? Ich möchte wissen, wie es funktioniertInnerhalb.