Desenvolvimento - C#

Tratamento global de exceções em aplicações Windows Forms

Este é um artigo rápido e objetivo onde o autor aborda como tratar globalmente exceções.

por Marcos Dell Antonio



Este é um artigo rápido e objetivo onde abordo como tratar globalmente exceções.

A idéia de escrevê-lo surgiu após uma pesquisa feita na web para responder a uma pergunta da lista de discussão CSharp-Br (www.csharpbr.com.br). Infelizmente só encontrei documentação em inglês, então resolvi usá-la como referência e escrever algo em português.

A idéia é substituir o tratamento padrão de exceções do Framework pelo nosso. Através disso, é possível implementar um controle padrão para erros não detectados durante o desenvolvimento.

Um exemplo típico de controle é a geração de arquivos de log com as mensagens de erro retornadas.

Enquanto fazia a pesquisa na internet, encontrei um artigo que falava até de envio de e-mails para os responsáveis pelo software notificando a ocorrência do erro. “O céu é o limite”.

- Exemplo simples

Como mencionado acima, o que pretendemos fazer é substituir o rotina tratadora de exceções pela nossa. No Windows Forms podemos fazer isso da seguinte forma:


Observação: não se esqueça de adicionar o using System.Threading.

A única coisa que fiz foi adicionar duas novas linhas ao método main(). A primeira instancia um objeto do tipo TrataEx (essa classe está descrita logo abaixo) e a segunda define a nova rotina que vai tratar as exceções.

É importante destacar que só as exceções não tratadas com try/catch é que chegarão ao tratador global.

A definição da classe TrataEx é a seguinte:


Observações: essa classe deve ficar no mesmo namespace que o método main().

Com essas linhas de código já podemos fazer um teste. Na aplicação atual (acredito que você já tenha criado uma nova aplicação Windows Forms, se não criou faça isso agora), adicione um botão e no evento Click dele, digite o seguinte:



O código acima gera uma exceção de divisão por zero, mas quem vai tratar ela será o nosso tratador Trata implementado na classe TrataEx. Ao clicar no botão, a saída será a seguinte:

user posted image

- Alguns exemplos práticos (conceito)

O exemplo anterior serviu para introduzir a idéia que eu queria mostrar. Esse tópico tem justamente o nome de “Alguns exemplos práticos (conceito)”, pois prefiro deixar pra vocês a codificação dos controles possíveis. Acredito que isso seja simples de ser feito.

Alguns controles que podem ser implementados no tratador global:
- gerar log de erros;
- mostrar mensagem padrão para um erro;
- enviar notificação aos responsáveis pelo software;
- e etc.

- Observações gerais

Gostaria de ressaltar o conceito de que somente as exceções não tratadas com try/catch é que passarão pelo tratador global.

Uma forma bem legal para que o tratador global trate também erros que já são previstos com try/catch, é essa:



Perceba que adicionei um try/catch individual para pegar a divisão por zero. Logo após esse erro, gero uma outra exceção que irá chamar o tratador global. Dessa forma é possível implementar a geração de log (se for o caso) mesmo para tratamentos individuais.

- Será que vale a pena?

Não sei até que ponto vale a pena ter um tratador global de exceções ou não, afinal nunca usei em uma aplicação final, somente em testes acadêmicos. Entretanto, acho a idéia muito interessante e com certeza se for bem planejada pode ser de extrema utilidade.

Gostaria de chamar a atenção para um bug existente no tratamento de exceções do Framework 1.1. Mais informações podem ser encontradas na segunda referência desse artigo (Microsoft Corporation). Deixo esse assunto por conta de vocês!

- Referências bibliográficas

MCFARLANE, Kevin. Managing Unhandled Exceptions in .NET. Disponível em: <http://www.codeproject.com/dotnet/unhandledexceptions.asp>. Set. 2003. Acesso em: 13 out. 2005.

MICROSOFT, Microsoft Corporation. BUG: An exception does not propagate correctly to the calling function in a Windows Forms application project in
Visual Studio .NET. Disponível em:
<http://support.microsoft.com/?scid=kb%3Ben-us%3B836674&x=18&y=7>.
Marcos Dell Antonio

Marcos Dell Antonio - Profissional certificado (MCPD, MCTS e MCP) em tecnologias da Microsoft e especialista em .NET e Visual Studio Team System. Site: www.marcosdellantonio.net.