Compartilhar via


Evento System.AppDomain.UnhandledException

Este artigo fornece observações complementares à documentação de referência para essa API.

O evento UnhandledException fornece notificação de exceções não capturadas. Ele permite que o aplicativo registre informações sobre a exceção antes que o manipulador padrão do sistema relate a exceção ao usuário e encerre o aplicativo. Se informações suficientes sobre o estado do aplicativo estiverem disponíveis, outras ações podem ser executadas - como salvar dados do programa para recuperação posterior. Recomenda-se cuidado, pois os dados do programa podem ser corrompidos quando as exceções não são tratadas. O manipulador também estará em execução enquanto mantém os bloqueios mantidos quando a exceção foi lançada, portanto, deve-se tomar cuidado para evitar esperar por outros recursos que possam introduzir deadlocks.

Esse evento pode ser manipulado em qualquer domínio de aplicativo. No entanto, o evento não é necessariamente gerado no domínio do aplicativo em que a exceção ocorreu. Uma exceção será não tratada somente se toda a pilha do thread tiver sido desenrolada sem encontrar um manipulador de exceção aplicável; assim, o primeiro lugar onde o evento pode ser gerado é no domínio de aplicativo onde o thread se originou.

Se o UnhandledException evento for manipulado no domínio de aplicativo padrão, ele será gerado para qualquer exceção sem tratamento em qualquer thread, independentemente do domínio de aplicativo em que o thread foi iniciado. Se o thread for iniciado em um domínio de aplicativo que tenha um manipulador de eventos para UnhandledException, o evento será gerado nesse domínio de aplicativo. Se esse domínio de aplicativo não for o domínio de aplicativo padrão e também houver um manipulador de eventos no domínio de aplicativo padrão, o evento será gerado em ambos os domínios de aplicativo.

Por exemplo, suponha que um thread comece no domínio de aplicativo "AD1", chame um método no domínio de aplicativo "AD2" e, a partir daí, chame um método no domínio de aplicativo "AD3", onde ele lança uma exceção. O primeiro domínio de aplicativo no qual o UnhandledException evento pode ser gerado é "AD1". Se esse domínio de aplicativo não for o domínio de aplicativo padrão, o evento também poderá ser gerado no domínio de aplicativo padrão.

Observação

O Common Language Runtime suspende as anulações de thread enquanto os manipuladores de eventos do UnhandledException evento estão em execução.

Se o manipulador de eventos tiver um ReliabilityContractAttribute atributo com os sinalizadores apropriados, o manipulador de eventos será tratado como uma região de execução restrita.

A partir do .NET Framework 4, esse evento não é gerado para exceções que corrompem o estado do processo, como estouros de pilha ou violações de acesso, a menos que o manipulador de eventos seja crítico para a segurança e tenha o HandleProcessCorruptedStateExceptionsAttribute atributo.

Para registrar um manipulador de eventos para esse evento, você deve ter as permissões necessárias, caso contrário, um SecurityException será lançado.

Para obter mais informações sobre como manipular eventos, consulte Manipulando e gerando eventos.

Outros eventos para exceções não tratadas

Para determinados modelos de aplicativo, o UnhandledException evento pode ser preemptado por outros eventos se a exceção sem tratamento ocorrer no thread principal do aplicativo.

Em aplicativos que usam Windows Forms, exceções sem tratamento no thread do aplicativo principal fazem com que o Application.ThreadException evento seja gerado. Se esse evento for manipulado, o comportamento padrão será que a exceção sem tratamento não encerrará o aplicativo, embora o aplicativo seja deixado em um estado desconhecido. Nesse caso, o UnhandledException evento não é gerado. Esse comportamento pode ser alterado usando o arquivo de configuração do aplicativo ou usando o Application.SetUnhandledExceptionMode método para alterar o modo para UnhandledExceptionMode.ThrowException antes que o manipulador de ThreadException eventos seja conectado. Isso se aplica apenas ao thread principal do aplicativo. O UnhandledException evento é gerado para exceções sem tratamento lançadas em outros threads.

A estrutura do aplicativo Visual Basic fornece outro evento para exceções sem tratamento no thread principal do aplicativo — o evento WindowsFormsApplicationBase.UnhandledException. Esse evento tem um objeto de argumentos de evento com o mesmo nome que o objeto de argumentos de evento usado pelo AppDomain.UnhandledException, mas com propriedades diferentes. Em particular, esse objeto de argumentos de evento tem uma ExitApplication propriedade que permite que o aplicativo continue em execução, ignorando a exceção sem tratamento (e deixando o aplicativo em um estado desconhecido). Nesse caso, o AppDomain.UnhandledException evento não é gerado.