System.AppDomain.UnhandledException – událost
Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.
Událost UnhandledException poskytuje oznámení o nezachycených výjimkách. Umožňuje aplikaci protokolovat informace o výjimce předtím, než výchozí obslužná rutina systému oznámí výjimku uživateli a ukončí aplikaci. Pokud je k dispozici dostatek informací o stavu aplikace, mohou být provedeny další akce, například ukládání dat programu pro pozdější obnovení. Upozornění se doporučuje, protože data programu se můžou poškodit, když se nezpracují výjimky. Obslužná rutina bude také spuštěna při blokování zámků uchovávaného při vyvolání výjimky, takže je potřeba věnovat pozornost tomu, abyste se vyhnuli čekání na jiné prostředky, které by mohly zavádět vzájemné zablokování.
Tuto událost lze zpracovat v jakékoli doméně aplikace. Událost však nemusí být nutně vyvolána v doméně aplikace, kde došlo k výjimce. Výjimka je neošetřená pouze v případě, že byl celý zásobník pro vlákno unwound bez vyhledání příslušné obslužné rutiny výjimky, takže první místo, kde událost může být vyvolána, je v doméně aplikace, kde vlákno pochází.
UnhandledException Pokud je událost zpracována ve výchozí doméně aplikace, je vyvolána u jakékoli neošetřené výjimky v jakémkoli vlákně bez ohledu na to, v jaké doméně aplikace vlákno začalo. Pokud vlákno spuštěné v doméně aplikace, která má obslužnou rutinu události pro UnhandledException, je událost vyvolána v této doméně aplikace. Pokud tato doména aplikace není výchozí doménou aplikace a ve výchozí doméně aplikace je také obslužná rutina události, vyvolá se událost v obou doménách aplikace.
Předpokládejme například, že vlákno začíná v doméně aplikace AD1, volá metodu v doméně aplikace AD2 a odtud volá metodu v doméně aplikace AD3, kde vyvolá výjimku. První doména aplikace, ve které UnhandledException může být událost vyvolána, je AD1. Pokud tato doména aplikace není výchozí doménou aplikace, může být událost vyvolána také ve výchozí doméně aplikace.
Poznámka:
Modul CLR (Common Language Runtime) pozastaví přerušení vláken, zatímco se spouští obslužné rutiny UnhandledException událostí.
Pokud obslužná rutina události má ReliabilityContractAttribute atribut s příslušnými příznaky, obslužná rutina události se považuje za omezenou oblast provádění.
Počínaje rozhraním .NET Framework 4 není tato událost vyvolána pro výjimky, které poškodí stav procesu, jako jsou přetečení zásobníku nebo porušení přístupu, pokud obslužná rutina události není kritická pro zabezpečení a nemá HandleProcessCorruptedStateExceptionsAttribute atribut.
Chcete-li zaregistrovat obslužnou rutinu události pro tuto událost, musíte mít požadovaná oprávnění nebo SecurityException je vyvolán.
Další informace o zpracování událostí naleznete v tématu Zpracování a vyvolávání událostí.
Další události pro neošetřené výjimky
U některých aplikačních modelů UnhandledException může být událost předem zrušena jinými událostmi, pokud dojde k neošetřené výjimce v hlavním vlákně aplikace.
V aplikacích, které používají model Windows Forms, neošetřené výjimky v hlavním vlákně aplikace způsobí Application.ThreadException vyvolání události. Pokud se tato událost zpracuje, výchozí chování spočívá v tom, že neošetřená výjimka aplikaci neukončí, i když aplikace zůstane v neznámém stavu. V takovém případě UnhandledException se událost nevyvolá. Toto chování lze změnit pomocí konfiguračního souboru aplikace nebo pomocí Application.SetUnhandledExceptionMode metody změnit režim na UnhandledExceptionMode.ThrowException před ThreadException připojení obslužné rutiny události. To platí jenom pro hlavní vlákno aplikace. Událost UnhandledException je vyvolána pro neošetřené výjimky vyvolané v jiných vláknech.
Aplikační architektura jazyka Visual Basic poskytuje další událost pro neošetřené výjimky v hlavním vlákně aplikace – WindowsFormsApplicationBase.UnhandledException událost. Tato událost má objekt argumentů události se stejným názvem jako objekt argumentů události používaný AppDomain.UnhandledExceptionobjektem , ale s různými vlastnostmi. Konkrétně tento objekt argumentů události má ExitApplication vlastnost, která umožňuje aplikaci pokračovat ve spuštění, ignorování neošetřené výjimky (a ponechání aplikace v neznámém stavu). V takovém případě AppDomain.UnhandledException se událost nevyvolá.