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.