Pergunta: Desejo definir um manipulador de exceção global para exceções não tratadas no meu aplicativo de console. No asp.net, pode-se definir um em global.asax e, em aplicativos / serviços do Windows, pode-se definir como abaixo
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);
Mas como posso definir um manipulador de exceção global para um aplicativo de console?
currentDomain parece não funcionar (.NET 2.0)?
Editar:
Argh, erro estúpido.
No VB.NET, é necessário adicionar a palavra-chave "AddHandler" na frente do currentDomain, caso contrário, não será exibido o evento UnhandledException no IntelliSense ...
Isso ocorre porque os compiladores VB.NET e C # tratam o tratamento de eventos de maneira diferente.
fonte
Console.ReadLine()
ou qualquer outra perturbação do fluxo de programa, mas o que eu recebo é a exceção re-levantar de novo e de novo, e de novo..Se você tiver um aplicativo de thread único, poderá usar uma simples tentativa / captura na função Principal, no entanto, isso não cobre exceções que podem ser lançadas fora da função Principal, em outros threads, por exemplo (como observado em outros comentários). Este código demonstra como uma exceção pode causar o encerramento do aplicativo, mesmo que você tenha tentado manipulá-lo no Main (observe como o programa sai normalmente se você pressionar enter e permitir que o aplicativo saia normalmente antes que a exceção ocorra, mas se você permitir a execução , termina bastante infeliz):
Você pode receber uma notificação de quando outro encadeamento lança uma exceção para executar alguma limpeza antes da saída do aplicativo, mas, pelo que sei, não é possível, a partir de um aplicativo de console, forçar o aplicativo a continuar em execução se você não manipular a exceção no encadeamento do qual ele é lançado sem usar algumas opções de compatibilidade obscuras para fazer com que o aplicativo se comporte como no .NET 1.x. Este código demonstra como o thread principal pode ser notificado sobre exceções provenientes de outros threads, mas ainda será finalizado infelizmente:
Portanto, na minha opinião, a maneira mais limpa de lidar com isso em um aplicativo de console é garantir que cada encadeamento tenha um manipulador de exceções no nível raiz:
fonte
Você também precisa lidar com exceções de threads:
Opa, desculpe pelo uso do winforms, para todos os threads que você estiver usando em um aplicativo de console, será necessário incluir um bloco try / catch. Os encadeamentos em segundo plano que encontram exceções sem tratamento não fazem com que o aplicativo seja finalizado.
fonte
Acabei de herdar um aplicativo de console antigo do VB.NET e precisava configurar um manipulador de exceção global. Como essa pergunta menciona o VB.NET algumas vezes e está marcada com o VB.NET, mas todas as outras respostas aqui estão em C #, pensei em adicionar a sintaxe exata para um aplicativo VB.NET também.
Usei o
REM
marcador de comentário em vez da aspas simples aqui, porque o Stack Overflow parecia lidar com a sintaxe destacando um pouco melhorREM
.fonte
O que você está tentando deve funcionar de acordo com os documentos do MSDN para .Net 2.0. Você também pode tentar uma tentativa / captura diretamente no ponto de entrada do aplicativo de console.
E agora a sua captura vai lidar com qualquer coisa não capturada ( na thread principal ). Pode ser simples e até reiniciar onde estava, se você quiser, ou você pode simplesmente deixar o aplicativo morrer e registrar a exceção. Você adicionará um finalmente se quiser fazer alguma limpeza. Cada encadeamento exigirá seu próprio tratamento de exceção de alto nível semelhante ao principal.
Editado para esclarecer o ponto sobre os tópicos, como apontado por BlueMonkMN e mostrado em detalhes em sua resposta.
fonte