Jak działa funkcja `try / catch` w szczegółach

Chciałbym, aby wnętrzności jak to zrobićtry {} catch {} działa śledzenie bloku i stosu.

czytałemten świetny artykuł o wyjątkach dotyczących anty-wzorców i znalazłem następujący akapit:

catch (NoSuchMethodException e) {
  throw new MyServiceException("Blah: " +
      e.getMessage());
}

To niszczy ślad stosu oryginalnego wyjątku i jest zawsze błędny.

Po tym zdałem sobie sprawę, że nienaprawdę wiem jaktry/catch Prace. Moje rozumienie jest następujące. Rozważmy przykład:

void top() {
    try {
        f();
    } catch (MyException ex) {
        handleIt(); 
    } finally {
        cleanup();
    }
}

void f() {
    g();
}

void g() {
    throw new MyException();
}

Kiedy dzwoniętop(), łańcuch połączeńtop -> f -> g zostawia dwaramki stosu na stosie połączeń (dlatop if Funkcje). Kiedy wyjątek jest podniesiony wg, program pęcherzy stos wykonywania, dopóki nie znajdzietry/catch blok, który obsługuje wyjątek. Tymczasem uwalnia ramki stosu i dołącza informacje śledzenia stosu do jakiegoś „magicznego” obiektu, który można przekazaćcatch a ślad stosu można wydrukować.

Skąd wiadomo, że wywołana funkcja jest „otoczona” blokiem try / catch? Czy ta informacja jest związana z ramą stosu? Na przykład wskaźnik do bloku obsługi błędów (niektóre przełączniki wybierające dopasowanie)catch blok) i wskaźnik dofinally blok? Czemue.getMessage() jest destrukcyjny w powyższym przykładzie (patrz komentarze)?

Uwaga, jawiedzieć jak używać try / catch i wyjątków, chcę wiedzieć, jak to działawewnątrz.

questionAnswers(3)

yourAnswerToTheQuestion