Chronometraż dla obsługi wyjątków: podsumowanie
Program obsługi przerwania jest wykonywany niezależnie od tego, w jaki sposób został przerwany blok instrukcji __try.Przyczyny obejmują skok na zewnątrz bloku __try, instrukcją longjmp, która przenosi sterowanie na zewnątrz bloku i rozwinięcie stosu z powodu obsługi wyjątku.
[!UWAGA]
Język Visual C++ obsługuje dwie postacie instrukcji setjmp i longjmp.Szybka wersja omija obsługę przerwania, ale jest bardziej wydajna.Aby użyć tej wersji, dołącz plik SETJMP.H.Druga wersja zapewnia obsługę przerwania opisaną w poprzednim akapicie.Aby użyć tej wersji, dołącz plik SETJMPEX.H.Wzrost wydajności z użycia wersji szybkiej zależy od konfiguracji sprzętowej.
System operacyjny wykonuje wszystkie programy obsługi przerwania w odpowiedniej kolejności, zanim wykonany będzie jakikolwiek inny kod, włączając w to treść programu obsługi wyjątku.
Gdy przyczyną przerwania jest wyjątek, system musi najpierw wykonać część filtru co najmniej jednego programu obsługi wyjątku, zanim zdecyduje co przerwać.Kolejność zdarzeń jest następująca:
Zgłaszany jest wyjątek.
System przeszukuje hierarchię aktywnych programów obsługi wyjątku i wykonuje filtr programu obsługi o najwyższym priorytecie; jest to ostatnio zainstalowany, najgłębiej zagnieżdżony względem bloków i wywołań funkcji, program obsługi wyjątku.
Jeśli filtr przekaże sterowanie (zwróci 0), proces jest kontynuowany, dopóki nie zostanie znaleziony filtr, który nie przekaże sterowania.
Jeśli filtr ten zwróci ‑1, wykonywanie jest kontynuowane w miejscu, w którym został zgłoszony wyjątek, a przerwanie nie zachodzi.
Jeśli filtr zwróci 1, zachodzą następujące zdarzenia:
System rozwija stos, czyszcząc wszystkie ramki stosu między kodem wykonywanym w bieżącym momencie (w którym został zgłoszony wyjątek), a ramką stosu, która zawiera program obsługi wyjątku uzyskujący kontrolę.
Gdy stos jest rozwinięty, wykonywany jest każdy znajdujący się na nim program obsługi przerwania.
Wykonywany jest właściwy program obsługi przerwania.
Sterowanie jest przekazywane do wiersza kodu następującego po programie obsługi wyjątku.