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. Program obsługi będzie również uruchamiany podczas przechowywania blokad przechowywanych w momencie zgłoszenia wyjątku, dlatego należy zachować ostrożność, aby uniknąć oczekiwania na inne zasoby, które mogłyby spowodować zakleszczenia.
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.