Wysyłanie wyjątków

W przypadku wystąpienia wyjątku sprzętowego lub oprogramowania procesor zatrzymuje wykonywanie w momencie wystąpienia wyjątku i przekazuje kontrolę do systemu. Najpierw system zapisuje zarówno stan maszyny bieżącego wątku, jak i informacje opisujące wyjątek. Następnie system próbuje znaleźć procedurę obsługi wyjątków w celu obsługi wyjątku.

Stan komputera wątku, w którym wystąpił wyjątek, jest zapisywany w strukturze CONTEXT. Te informacje (nazywane rekordem kontekstu ) umożliwiają systemowi kontynuowanie wykonywania w punkcie wyjątku, jeśli wyjątek został pomyślnie obsłużony. Opis wyjątku (nazywanego rekordem wyjątku ) jest zapisywany w strukturze EXCEPTION_RECORD. Ponieważ przechowuje informacje zależne od komputera rekord kontekstu niezależnie od informacji niezależnych od maszyny rekordu wyjątku, mechanizm obsługi wyjątków jest przenośny na różnych platformach.

Informacje w rekordach kontekstu i wyjątków są dostępne za pomocą funkcji GetExceptionInformation i mogą być dostępne dla wszystkich procedur obsługi wyjątków wykonywanych w wyniku wyjątku. Rekord wyjątku zawiera następujące informacje.

  • Kod wyjątku identyfikujący typ wyjątku.
  • Flagi wskazujące, czy wyjątek jest ciągły. Każda próba kontynuowania wykonywania po wystąpieniu wyjątku niekontynuowalnego generuje inny wyjątek.
  • Wskaźnik do innego rekordu wyjątku. Ułatwia to tworzenie połączonej listy wyjątków, jeśli wystąpią wyjątki zagnieżdżone.
  • Adres, pod którym wystąpił wyjątek.
  • Tablica argumentów, które zawierają dodatkowe informacje o wyjątku.

W przypadku wystąpienia wyjątku w kodzie trybu użytkownika system używa następującej kolejności wyszukiwania, aby znaleźć procedurę obsługi wyjątków:

  1. Jeśli proces jest debugowany, system powiadamia debugera. Aby uzyskać więcej informacji, zobacz Debugger Exception Handling.
  2. Jeśli proces nie jest debugowany lub skojarzony debuger nie obsługuje wyjątku, system próbuje zlokalizować program obsługi wyjątków oparty na ramce, przeszukując ramki wątku, w którym wystąpił wyjątek. System najpierw przeszukuje bieżącą ramkę stosu, a następnie przeszukuje poprzednie ramki stosu w odwrotnej kolejności.
  3. Jeśli nie można odnaleźć programu obsługi opartego na ramce lub żaden program obsługi oparty na ramce nie obsługuje wyjątku, ale proces jest debugowany, system powiadamia debugera po raz drugi.
  4. Jeśli proces nie jest debugowany lub skojarzony debuger nie obsługuje wyjątku, system zapewnia domyślną obsługę na podstawie typu wyjątku. W przypadku większości wyjątków domyślną akcją jest wywołanie funkcjiExitProcess.

W przypadku wystąpienia wyjątku w kodzie trybu jądra system przeszukuje ramki stosu jądra w celu zlokalizowania procedury obsługi wyjątków. Jeśli program obsługi nie może znajdować się lub żaden program obsługi nie obsługuje wyjątku, system zostanie zamknięty tak, jakby wywołano funkcję ExitWindows.