C#  -  Obtendo a Exception raiz do problema


 Nesta dica vou mostrar como podemos obter a exceção mais interna, e, em muitos casos, a raiz do problema quando a exceção foi lançada.

Em um bloco try/catch o lançamento e a captura de exceções pode conter uma ou mais exceções internas. A exceção mais interna geralmente indica a origem do problema.

O método GetBaseException() da classe Exception exibe informações somente sobre a exceção mais interna (original); nenhuma outra informação de exceção é exibida. Este método não aceita parâmetros.

Ex: Console. WriteLine (ex.GetBaseException().ToString ());

Chamando o método GetBaseException().ToString() em um objeto Exception que contém uma exceção interna vai gerar a mesma informação sobre o erro como se tivéssemos usado o método ToString() diretamente na exceção interna.

Este método egue a cadeia de exceções usando a InnerException e para quando chega à exceção mais interna.

Nesta dica vou mostrar como você pode obter a exceção original lançada descartando todas as demais exceção para assim obter a raiz do problema.

Recursos Usados

Criando o projeto Console Application

Abra o VS 2015 Community e crie um novo projeto (File-> New Project) usando a linguagem C# e o template Console Applicaiton.

Informe um nome a seu gosto. Eu vou usar o nome C_InnerException;

A seguir defina o seguinte código na classe Program.cs :

using System;
namespace C_InnerException
{
    class Program
    {
        static void Main(string[] args)
        {
            Exception maisInterna = new Exception("A exceção maisInterna.");
            ArgumentException interna = new ArgumentException("A Exception interna.",maisInterna);
            NullReferenceException se = new NullReferenceException("Macoratti .net - Quase tudo para .Net", interna);
            try
            {
                throw (se);
            }
            catch(Exception ex)
            {
                Console.WriteLine("** Main() ApplicationException:");
                Console.WriteLine("  Exception Base : ");
                Console.WriteLine("  {0}", ex.GetBaseException().ToString());
                Console.ReadKey();
            }
        }
    }
}

Executando o projeto iremos obter:

Observe que nenhuma exceção que não seja a exceção maisInterna é exibida.

Uma comparação com um tratamento usando o código abaixo:

            try
            {
                throw (se);
            }
            catch(Exception ex)
            {
                
                Console.WriteLine("** Main() ApplicationException:");
                Console.WriteLine("  {0}", ex.Message);
                Console.WriteLine("  {0}", ex.InnerException.Message);
                Console.WriteLine("  Exception Base : ");
                Console.WriteLine("  {0}", ex.GetBaseException().ToString());
                Console.ReadKey();
            }

Mostra a diferença do resultado obtido.



Dessa forma esta técnica é útil para chegar na raiz do problema durante a filtragem de todas as demais exceções.

(Disse Jesus) - 'Aquele que tem os meus mandamentos e os guarda esse é o que me ama; e aquele que me ama será amado de meu Pai, e eu o amarei, e me manifestarei a ele.'
João 14:21

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti