2010-09-27 13 views

Odpowiedz

8

to nie jest pytanie C#/java/C++. Jak to działa wewnętrznie, jak linia wie, aby przejść oświadczenie catch.

Jak to działa wewnętrznie sprawia, że ​​jest to prawie C#/java/C++ pytanie (ponieważ zostanie ono zaimplementowane inaczej).

W języku Java blok try instaluje się w specjalnej tabeli (w pliku klasy). Kiedy JVM zgłasza wyjątek, sprawdza tę tabelę, aby zobaczyć, gdzie znajduje się następny haczyk lub w końcu blok, do którego należy przejść.

6

W przypadku wystąpienia wyjątku wykonywana jest specjalna instrukcja (zwykle nazywana przerwaniem). Prowadzi to do wykonania ogólnej procedury obsługi błędów, która rozpoznaje, która jest najnowszą zainstalowaną odpowiednią obsługą wyjątku. Ten program obsługi jest następnie wykonywany.

+0

to wszystko jest znane ... program obsługi dziecka wykonuje się najpierw .. oczekuję odpowiedzi od oprogramowania systemowego/zestawu /.net framework – selvaraj

+0

czy możesz wyjaśnić specjalne instrukcje, że cokolwiek byś pomyślał: – selvaraj

+2

@saj: W natywnych programach C++ używana jest specjalna instrukcja procesora 'int', która jest wykonywana i zatrzymuje program, a następnie sterowanie jest automatycznie przenoszone do obsługi przerwań systemu operacyjnego, który z kolei widzi, że jest to wyjątek C++ i przenosi kontrolę do obsługi wyjątków C++. – sharptooth

0

powinien działać we wszystkich Langues trochę jak ten:

if (error_occured xy while doing things in try){ 
    call_catch_part(error xy) 
} 
0

To jest w zasadzie analizowania podstaw języka. Możesz uzyskać wszystkie informacje na Here

0

można zrobić to samo w C, nawet jeśli nie ma wyjątków obsługi per se.

Nie używałbyś wtedy setjmp/longjmp Niestety, nie możesz odłożyć stosu i sam sobie poradzisz.

5

Istnieje różnica w tym, w jaki sposób obsługiwane są wyjątki między natywnie kompilowanymi językami, takimi jak C++, a językami, w których kod bajtowy jest wykonywany na maszynie wirtualnej, takiej jak Java lub C#.

Kompilatory C++ zwykle generują kod, który protokołuje informacje potrzebne do obsługi wyjątków w czasie wykonywania. Dedykowana struktura danych służy do zapamiętywania wejścia/wyjścia bloków try i związanej z nimi obsługi wyjątków. Gdy wystąpi wyjątek, generowane jest przerwanie, a kontrola jest przekazywana do systemu operacyjnego, który z kolei sprawdza stos wywołań i określa, który wywoływacz wyjątków ma zostać wywołany.

Dalsze szczegóły są dość dobrze wyjaśnione w poniższym artykule przez Vishal Kochhar:

How a C++ compiler implements exception handling

W Javie lub .NET nie ma potrzeby obciążania utrzymywanie wyjątek przetwarzania informacji ponieważ środowisko wykonawcze będzie mogło analizować kod bajtowy, aby znaleźć odpowiednią procedurę obsługi wyjątku. W związku z tym tylko wyjątki, które są faktycznie rzucane powodują obciążenie.

Powiązane problemy