segunda-feira, 16 de abril de 2007

Tratamento de erros: Objeto Exception parte 3

InnerException

Nos dois últimos artigos falei sobre o objeto exception e suas principais características. Agora, para concluir, irei falar sobre uma propriedade importante do objeto Exception, a InnerException. Essa propriedade não é utilizada por muitas exceções, mas quando é utilizada, é importante analisá-la para obter informações mais completas a respeito do erro.

Se queremos tratar um erro apenas para adicionar informações extras a ele, mas sem perder o erro original, podemos encapsular esse erro em outro objeto exception. O erro original será referenciado pela propriedade InnerException desse erro original.

Como um exemplo da aplicação dessa técnica, imagine que esteja criando uma classe base de acesso a dados, com métodos como ExecutarProc ou coisa do tipo. Se você quiser que , quando um erro ocorrer ao executar uma proc, você queira informar o nome da procedure chamada, pode capturar o erro que ocorreu durante a execução, criar um novo erro com o nome da proc, e encapsular o erro original na propriedade InnerException do erro criado. Em um artigo futuro, irei falar sobre como criar suas próprias exceções, então falarei mais sobre InnerException.

Um exemplo no framework onde isso é utilizado, é na classe XmlSerializer. Esse classe server para gravar e carregar objetos em formato XML. Quando você carrega um xml com esse objeto, e o xml está mal formado, irá obter uma mensagem do tipo : "There is an error in the XML Document (Há um erro no documento XML)". Só essa mensagem não te ajuda muito a descobrir o problema com o arquivo. Mas se você analisar a propriedade InnerException da exceção gerada, verá outro objeto Exception com a mensagem que descreve exatamente qual o problema no xml.

Não existe um limite para a propriedade InnerException, pode ser criada uma cadeia de exceções, cada uma fornecendo um detalhe adicional sobre o erro. É importante, ao criar o mecanismo de tratamento de erros da sua aplicação analisar a propriedade InnerException da exceção (e das próprias InnerException), pois podem haver informações importantes lá.

Nenhum comentário: