Condividi tramite


Evento System.AppDomain.UnhandledException

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

L'evento UnhandledException fornisce la notifica delle eccezioni non rilevate. Consente all'applicazione di registrare le informazioni sull'eccezione prima che il gestore predefinito del sistema segnala l'eccezione all'utente e termina l'applicazione. Se sono disponibili informazioni sufficienti sullo stato dell'applicazione, è possibile eseguire altre azioni, ad esempio salvare i dati del programma per un ripristino successivo. È consigliabile prestare attenzione, perché i dati del programma possono diventare danneggiati quando le eccezioni non vengono gestite. Il gestore verrà eseguito anche tenendo premuti blocchi quando è stata generata l'eccezione, quindi è necessario prestare attenzione a evitare l'attesa su altre risorse che potrebbero introdurre deadlock.

Questo evento può essere gestito in qualsiasi dominio applicazione. Tuttavia, l'evento non viene necessariamente generato nel dominio dell'applicazione in cui si è verificata l'eccezione. Un'eccezione non viene gestita solo se l'intero stack per il thread è stato interrotto senza trovare un gestore eccezioni applicabile, quindi la prima posizione in cui può essere generato l'evento si trova nel dominio dell'applicazione in cui è stato originato il thread.

Se l'evento UnhandledException viene gestito nel dominio applicazione predefinito, viene generato per qualsiasi eccezione non gestita in qualsiasi thread, indipendentemente dal dominio dell'applicazione in cui è stato avviato il thread. Se il thread è stato avviato in un dominio applicazione con un gestore eventi per UnhandledException, l'evento viene generato nel dominio dell'applicazione. Se tale dominio applicazione non è il dominio applicazione predefinito ed è presente anche un gestore eventi nel dominio applicazione predefinito, l'evento viene generato in entrambi i domini applicazione.

Si supponga, ad esempio, che un thread venga avviato nel dominio applicazione "AD1", chiami un metodo nel dominio applicazione "AD2" e da lì chiami un metodo nel dominio applicazione "AD3", in cui genera un'eccezione. Il primo dominio applicazione in cui è possibile generare l'evento UnhandledException è "AD1". Se tale dominio applicazione non è il dominio applicazione predefinito, l'evento può essere generato anche nel dominio applicazione predefinito.

Nota

Common Language Runtime sospende l'interruzione del thread mentre i gestori eventi per l'evento UnhandledException sono in esecuzione.

Se il gestore eventi ha un ReliabilityContractAttribute attributo con i flag appropriati, il gestore eventi viene considerato come un'area di esecuzione vincolata.

A partire da .NET Framework 4, questo evento non viene generato per eccezioni che danneggiano lo stato del processo, ad esempio gli overflow dello stack o le violazioni di accesso, a meno che il gestore eventi non sia critico per la sicurezza e abbia l'attributo HandleProcessCorruptedStateExceptionsAttribute .

Per registrare un gestore eventi per questo evento, è necessario disporre delle autorizzazioni necessarie oppure viene generata un'eccezione SecurityException .

Per ulteriori informazioni sulla gestione degli eventi, consultare gestione e generazione di eventi.

Altri eventi per le eccezioni non gestite

Per determinati modelli di applicazione, l'evento UnhandledException può essere superato da altri eventi se l'eccezione non gestita si verifica nel thread dell'applicazione principale.

Nelle applicazioni che usano Windows Form, le eccezioni non gestite nel thread dell'applicazione principale causano la generazione dell'eventoApplication.ThreadException. Se questo evento viene gestito, il comportamento predefinito è che l'eccezione non gestita non termina l'applicazione, anche se l'applicazione rimane in uno stato sconosciuto. In tal caso, l'evento UnhandledException non viene generato. Questo comportamento può essere modificato usando il file di configurazione dell'applicazione oppure usando il Application.SetUnhandledExceptionMode metodo per modificare la modalità su UnhandledExceptionMode.ThrowException prima che il ThreadException gestore eventi venga associato. Questo vale solo per il thread dell'applicazione principale. L'evento UnhandledException viene generato per le eccezioni non gestite generate in altri thread.

Il framework dell'applicazione Visual Basic fornisce un altro evento per le eccezioni non gestite nel thread dell'applicazione principale, ovvero l'evento WindowsFormsApplicationBase.UnhandledException . Questo evento ha un oggetto argomenti evento con lo stesso nome dell'oggetto argomenti evento utilizzato da AppDomain.UnhandledException, ma con proprietà diverse. In particolare, questo oggetto argomenti evento ha una ExitApplication proprietà che consente all'applicazione di continuare l'esecuzione, ignorando l'eccezione non gestita (e lasciando l'applicazione in uno stato sconosciuto). In tal caso, l'evento AppDomain.UnhandledException non viene generato.