Zdarzenie System.AppDomain.UnhandledException

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

Zdarzenie UnhandledException zawiera powiadomienie o nieuchwyconych wyjątkach. Umożliwia aplikacji rejestrowanie informacji o wyjątku przed domyślnym programem obsługi systemu zgłasza wyjątek dla użytkownika i kończy działanie aplikacji. Jeśli jest dostępna wystarczająca ilość informacji o stanie aplikacji, mogą zostać podjęte inne akcje , takie jak zapisywanie danych programu na potrzeby późniejszego odzyskiwania. Zaleca się zachowanie ostrożności, ponieważ dane programu mogą stać się uszkodzone, gdy wyjątki nie są obsługiwane.

To zdarzenie można obsłużyć w dowolnej domenie aplikacji. Jednak zdarzenie nie musi być zgłaszane w domenie aplikacji, w której wystąpił wyjątek. Wyjątek jest nieobsługiwany tylko wtedy, gdy cały stos wątku został odłączony bez znalezienia odpowiedniego programu obsługi wyjątków, więc pierwsze miejsce, w którym można podnieść zdarzenie, znajduje się w domenie aplikacji, w której pochodzi wątek.

UnhandledException Jeśli zdarzenie jest obsługiwane w domyślnej domenie aplikacji, jest zgłaszane tam dla nieobsługiwanego wyjątku w dowolnym wątku, niezależnie od domeny aplikacji, w której uruchomiono wątek. Jeśli wątek został uruchomiony w domenie aplikacji, która ma program obsługi zdarzeń dla UnhandledExceptionprogramu , zdarzenie zostanie zgłoszone w tej domenie aplikacji. Jeśli ta domena aplikacji nie jest domyślną domeną aplikacji i istnieje również program obsługi zdarzeń w domyślnej domenie aplikacji, zdarzenie jest zgłaszane w obu domenach aplikacji.

Załóżmy na przykład, że wątek rozpoczyna się w domenie aplikacji "AD1", wywołuje metodę w domenie aplikacji "AD2", a następnie wywołuje metodę w domenie aplikacji "AD3", gdzie zgłasza wyjątek. Pierwsza domena aplikacji, w której UnhandledException można zgłaszać zdarzenie, to "AD1". Jeśli ta domena aplikacji nie jest domyślną domeną aplikacji, zdarzenie można również podnieść w domyślnej domenie aplikacji.

Uwaga

Środowisko uruchomieniowe języka wspólnego zawiesza przerywanie wątków, gdy programy obsługi zdarzeń dla zdarzenia UnhandledException są wykonywane.

Jeśli program obsługi zdarzeń ma ReliabilityContractAttribute atrybut z odpowiednimi flagami, procedura obsługi zdarzeń jest traktowana jako ograniczony region wykonywania.

Począwszy od programu .NET Framework 4, to zdarzenie nie jest zgłaszane w przypadku wyjątków, które uszkodziły stan procesu, takie jak przepełnienia stosu lub naruszenia dostępu, chyba że procedura obsługi zdarzeń ma krytyczne znaczenie dla zabezpieczeń i ma HandleProcessCorruptedStateExceptionsAttribute atrybut .

Aby zarejestrować program obsługi zdarzeń dla tego zdarzenia, musisz mieć wymagane uprawnienia lub SecurityException jest zgłaszany.

Aby uzyskać więcej informacji na temat obsługi zdarzeń, zobacz Obsługa i podnoszenie zdarzeń.

Inne zdarzenia dla nieobsługiwane wyjątki

W przypadku niektórych modeli aplikacji zdarzenie może zostać wywłaszczone przez inne zdarzenia, UnhandledException jeśli nieobsługiwany wyjątek występuje w głównym wątku aplikacji.

W aplikacjach korzystających z formularzy Systemu Windows nieobsługiwane wyjątki w głównym wątku aplikacji powodują Application.ThreadException zgłoszenie zdarzenia. Jeśli to zdarzenie jest obsługiwane, domyślne zachowanie polega na tym, że nieobsługiwany wyjątek nie kończy aplikacji, chociaż aplikacja pozostaje w nieznanym stanie. W takim przypadku UnhandledException zdarzenie nie jest zgłaszane. To zachowanie można zmienić przy użyciu pliku konfiguracji aplikacji lub za pomocą Application.SetUnhandledExceptionMode metody , aby zmienić tryb na przed UnhandledExceptionMode.ThrowException podłączeniem ThreadException programu obsługi zdarzeń. Dotyczy to tylko głównego wątku aplikacji. Zdarzenie UnhandledException jest zgłaszane dla nieobsługiwanych wyjątków zgłaszanych w innych wątkach.

Struktura aplikacji języka Visual Basic udostępnia inne zdarzenie dla nieobsługiwane wyjątki w głównym wątku aplikacji — WindowsFormsApplicationBase.UnhandledException zdarzenie. To zdarzenie ma obiekt argumentów zdarzeń o tej samej nazwie co obiekt argumentów zdarzeń używany przez AppDomain.UnhandledException, ale z różnymi właściwościami. W szczególności ten obiekt argumentów zdarzeń ma ExitApplication właściwość, która umożliwia aplikacji kontynuowanie działania, ignorując nieobsługiwany wyjątek (i pozostawiając aplikację w nieznanym stanie). W takim przypadku AppDomain.UnhandledException zdarzenie nie jest zgłaszane.