System.AppDomain.UnhandledException-händelse

Kommentar

Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.

Händelsen UnhandledException innehåller ett meddelande om undantag som inte har genererats. Det gör att programmet kan logga information om undantaget innan systemstandardhanteraren rapporterar undantaget till användaren och avslutar programmet. Om det finns tillräckligt med information om programmets tillstånd kan andra åtgärder vidtas, till exempel att spara programdata för senare återställning. Försiktighet rekommenderas eftersom programdata kan skadas när undantag inte hanteras. Hanteraren kommer också att köras medan lås hålls kvar när undantaget utlöstes, så var noga med att undvika att vänta på andra resurser som kan leda till dödlägen.

Den här händelsen kan hanteras i alla programdomäner. Händelsen genereras dock inte nödvändigtvis i programdomänen där undantaget inträffade. Ett undantag är ohanterat endast om hela stacken för tråden har avvecklats utan att hitta en tillämplig undantagshanterare, så det första stället där händelsen kan aktiveras är i applikationsdomänen där tråden startade.

Om händelsen UnhandledException hanteras i standardprogramdomänen aktiveras den där för alla ohanterade undantag i alla trådar, oavsett vilken programdomän tråden startade i. Om tråden startade i en programdomän som har en händelsehanterare för UnhandledExceptiongenereras händelsen i programdomänen. Om programdomänen inte är standardprogramdomänen och det också finns en händelsehanterare i standardprogramdomänen, genereras händelsen i båda programdomänerna.

Anta till exempel att en tråd startar i programdomänen "AD1", anropar en metod i programdomänen "AD2" och därifrån anropar en metod i programdomänen "AD3", där den genererar ett undantag. Den första programdomänen UnhandledException där händelsen kan aktiveras är "AD1". Om programdomänen inte är standardprogramdomänen kan händelsen även aktiveras i standardprogramdomänen.

Kommentar

Common Language Runtime (CLR) pausar trådavbrott medan händelsehanterare för UnhandledException-händelsen körs.

Om händelsehanteraren har ett ReliabilityContractAttribute attribut med lämpliga flaggor behandlas händelsehanteraren som en begränsad körningsregion.

Från och med .NET Framework 4 aktiveras inte den här händelsen för undantag som skadar processens tillstånd, till exempel stackspill eller åtkomstöverträdelser, såvida inte händelsehanteraren är säkerhetskritisk och har HandleProcessCorruptedStateExceptionsAttribute attributet .

Om du vill registrera en händelsehanterare för den här händelsen måste du ha de nödvändiga behörigheterna, annars kastas en SecurityException.

Mer information om hur du hanterar händelser finns i Hantera och höja händelser.

Andra händelser för ohanterade undantag

För vissa programmodeller UnhandledException kan händelsen föregripas av andra händelser om det ohanterade undantaget inträffar i huvudprogramtråden.

I program som använder Windows Forms leder ohanterade undantag i huvudprogramtråden Application.ThreadException till att händelsen aktiveras. Om den här händelsen hanteras är standardbeteendet att det ohanterade undantaget inte avslutar programmet, även om programmet lämnas i ett okänt tillstånd. I så fall genereras UnhandledException inte händelsen. Det här beteendet kan ändras med hjälp av programkonfigurationsfilen eller med hjälp Application.SetUnhandledExceptionMode av metoden för att ändra läget till UnhandledExceptionMode.ThrowException innan ThreadException händelsehanteraren ansluts. Detta gäller endast för huvudprogramtråden. Händelsen UnhandledException aktiveras för ohanterade undantag som genereras i andra trådar.

Visual Basic-programramverket tillhandahåller en annan händelse för ohanterade undantag i huvudprogramtråden—händelsen WindowsFormsApplicationBase.UnhandledException. Den här händelsen har ett objekt för händelseargument med samma namn som det händelseargumentobjekt som används av AppDomain.UnhandledException, men med olika egenskaper. I synnerhet har det här händelseargumentobjektet en ExitApplication egenskap som gör att programmet kan fortsätta köras, ignorera det ohanterade undantaget (och lämna programmet i ett okänt tillstånd). I så fall genereras AppDomain.UnhandledException inte händelsen.