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 wirdgsprudelt 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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage