Exceções dentro de Threads no ASP.NET

by Israel Aece 4. December 2008 08:46

Quando uma exceção não tratada ocorre dentro na mesma thread que está executando a requisição, provavelmente teremos aquela famosa página amarela com os detalhes do erro, incluindo a mensagem, o tipo da exceção e a stack trace (vamos levar em conta que a seção customErrors está desabilitada), continuando a aplicação funcionando perfeitamente, ou seja, outras requisições não serão comprometidas.

Exceções não tratadas que ocorrem dentro da thread que executa a requisição não traz maiores problemas para a aplicação como um todo, ao contrário quando a exceção não tratada acontece dentro de uma thread a parte que, podem ser criadas através de uma instancia da classe Thread, através do método estático QueueUserWorkItem da classe ThreadPool ou, uma forma mais esotérica, quando alguma exceção acontece dentro de um destrutor de uma classe. Dependendo do que se precisa fazer, a utilização das páginas assíncronas garantem que um processo de IO seja efetuado em uma thread a parte mas, qualquer problema que eventualmente possa acontecer, a exceção sempre será disparada sob a thread que está executando a requisição.

Neste cenário, exceções não tratadas levam o AppDomain da respectiva aplicação ASP.NET ser reciclado e, com isso, todas as informações que estão armazenadas dentro do mesmo, como Session, Application e Cache serão perdidas, fazendo com que outros usuários sejam prejudicados. Aplicações que dependem destes dados, confiantes que uma vez definido nunca será nulo, podem começar a falhar e, um dos motivos podem ser justamente a questão de exceções não tratadas em threads.

Como essas exceções não tratadas não são catalogadas mesmo quando o Health Monitoring está habilitado, temos que recorrer ao conhecido evento UnhandledException da classe AppDomain. Podemos aqui utilizar um módulo para que todas as requisições façam o uso dele e, como exemplo, este artigo mostra detalhes da implementação deste importante módulo. Apesar de existir um contador de performance que contabiliza as reinicializações da aplicação, é sempre importante efetuar o log de possíveis exceções que podem estar sendo disparadas.

Tags: ,

.NET Framework | ASP.NET | Async

Comments are closed

Powered by BlogEngine.NET 1.5.0.0
Theme by Mads Kristensen

Sobre

Meu nome é Israel Aece e sou especialista em tecnologias de desenvolvimento Microsoft, atuando como desenvolvedor de aplicações para o mercado financeiro utilizando a plataforma .NET. [ Mais ]

Twitter

Indicações

Introdução ao ASP.NET Web API - e-Book