Exceções em threads gerenciados
O Common Language Runtime permite que a maioria das exceções sem tratamento em threads prossiga naturalmente. Na maioria dos casos, isso significa que a exceção sem tratamento causa o encerramento do aplicativo. No entanto, o Common Language Runtime fornece um escudo para certas exceções sem tratamento que serve para controlar o fluxo do programa:
Uma ThreadAbortException é gerada em um thread porque Abort foi chamado. Isso só se aplica a aplicativos .NET Framework.
Um AppDomainUnloadedException é gerado em um thread, pois o domínio do aplicativo no qual o thread está em execução está sendo descarregado.
O Common Language Runtime ou um processo de host encerra o thread lançando uma exceção interna.
Se qualquer uma dessas exceções não tiver tratamento em threads criados pelo common language runtime, a exceção encerrará o thread, mas o common language runtime não permitirá que a exceção prossiga.
Se essas exceções não tiverem tratamento no thread principal, ou em threads que entraram no runtime a partir do código não gerenciado, elas prosseguirão normalmente, resultando no encerramento do aplicativo.
Observação
É possível que o runtime gere uma exceção não tratada antes que qualquer código gerenciado tenha a chance de instalar um manipulador de exceção. Mesmo que o código gerenciado não tivesse possibilidade de manipular essa exceção, a exceção recebe a permissão para prosseguir naturalmente.
Expor problemas de threading durante o desenvolvimento
Quando os threads recebem a permissão para falhar em modo silencioso, sem encerrar o aplicativo, problemas graves de programação podem passar sem detecção. Esse é um problema específico para serviços e outros aplicativos executados por longos períodos. À medida que os threads falham, o estado do programa se torna cada vez mais corrompido. O desempenho do aplicativo pode piorar ou o aplicativo pode parar de responder.
Permitir que exceções sem tratamento em threads prossigam naturalmente, até que o sistema operacional encerre o programa, expõe esses problemas durante o desenvolvimento e teste. Relatórios de erros em depuração de suporte de encerramentos do programa.
Substituição do host
Um host não gerenciado pode usar a interface ICLRPolicyManager na API de hospedagem para substituir a política de exceções sem tratamento padrão do Common Language Runtime. A função ICLRPolicyManager::SetUnhandledExceptionPolicy é usada para definir a política para exceções sem tratamento.