TRATAMENTO DE ERROS EFICIENTE

 Tópico anterior Próximo tópico Novo tópico

TRATAMENTO DE ERROS EFICIENTE

C#

 Compartilhe  Compartilhe  Compartilhe
#442502 - 14/11/2014 07:51:00

LUIS HERRERA
NOVA ODESSA
Cadast. em:Julho/2005


Bom dia!
Criei um método publico para tratamento de erros, porém ele não está sendo eficiente. Trás muita informação (confusa) que as vezes mais atrapalha que ajuda e perco um bom tempo tentando localizar o problema.

Além disso, o Dot.Net não informa corretamente a linha onde o erro ocorreu (origem), mas sim a linha  Throw do método onde ocorreu e sua cadeia posterior.
Alguém conseguiu fazer um método publico que pudesse realmente ser eficiente e informar a linha exata do erro?

Abaixo segue o código que fiz, sendo sua chamada incluída em cada exception no sistema.
public static string MontaDadosDaExcecao(Exception ex, string myTextoAviso)
        {
            StringBuilder str = new StringBuilder();
            str.AppendLine("ERRO Em Try... Catch.");
            str.AppendLine("*********************************************************************************");
            str.AppendLine("");
            str.AppendLine("Message        : " + ex.Message);
            str.AppendLine("Source         : " + ex.Source);
            str.AppendLine("HelpLink       : " + ex.HelpLink);
            str.AppendLine("TargetSite     : " + ex.TargetSite);
            str.AppendLine("Inner Exception: " + ex.InnerException);
            str.AppendLine("Stack Trace    : " + ex.StackTrace);
            str.AppendLine("Data           : ");
            if (ex.Data != null)
            {
                // precisa de using System.Collections;
                foreach (DictionaryEntry de in ex.Data)
                {
                    str.AppendLine("Chave: " + de.Key + "   -   Valor: " + de.Value);
                }
            }
            return str.ToString();
        }  


LH
Preserve a Natureza
Faça Coleta Seletiva e Cuide da Fauna e Flora por onde passa ou vive.
Dedique um tempo ao seu espírito, mente sã e corpo são.
Você e sua famí­lia serão os maiores beneficiado.

#442505 - 14/11/2014 10:36:35

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Olá Luís.
Eu antes escrevo logo no inicio a opção : Option Strict On isto para que os erros sejam tratados logo em tempo real.

EX:

Option Strict On
Imports System.Text
Imports System.IO

Public Class PrincipalView .....


______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


#442509 - 14/11/2014 11:34:02

OCELOT
SOROCABA
Cadast. em:Março/2012


Option Strict é coisa do VB.Net e apenas desabilita algumas conversões automáticas e late binding do VB.Net, não existe equivalente no C# pois nele já funciona tudo basicamente como se fosse o Opition Strict On.

E eu diria que não tem forma mais eficiente de pegar os dados da exception que não seja usando o ToString() nela, não tem porque ficar pegando cada valor dela, o ToString já faz isso, porém não vai existir a linha exata do erro na exception, isso só existe se tiver o arquivo *.pdb correspondente ao programa, só que isso é algo que geralmente só se tem em modo debug e não se deve enviar para os clientes, já que este arquivo inclui informações do seu código fonte.

Com as exceptions o mais importante que você vai ter para tentar encontrar onde ocorreu o erro é o call stack, nela você vai ter todas as chamadas de funções que teve até chegar onde deu o erro, com isso as vezes você só consegue chegar até a função que ocorreu o erro, as vezes chega até a linha exata, dai é uma questão de aprender a ler e interpretar ele para poder encontrar as possíveis causas desta exception específica.



#442511 - 14/11/2014 11:55:02

LUIS HERRERA
NOVA ODESSA
Cadast. em:Julho/2005


Ocelot no código que postei, o que seria o tal "call stack"?    É o Stack Trace?
Como você sugere que eu altere esse código?

LH
Preserve a Natureza
Faça Coleta Seletiva e Cuide da Fauna e Flora por onde passa ou vive.
Dedique um tempo ao seu espírito, mente sã e corpo são.
Você e sua famí­lia serão os maiores beneficiado.

#442515 - 14/11/2014 12:08:20

JABA
CABO FRIO
Cadast. em:Agosto/2005


Exceções contém uma propriedade chamada StackTrace. Esta string contém o nome dos métodos na pilha de chamada atual, juntamente com o nome do arquivo e o número da linha onde a exceção foi lançada para cada método.
Um objeto StackTrace é criado automaticamente pelo Common Language Runtime (CLR) do ponto da instrução throw, de modo que as exceções devem ser lançados a partir do ponto onde o rastreamento de pilha deve começar.

Por isso, é preciso tomar cuidado como as exceções estão sendo lançadas. Evite lançar assim --> throw ex; lance assim --> throw; pois desta forma não perderá o lugar certo de onde veio a exceção.

OBS: Todas as exceções contém uma propriedade chamada Message.





_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#442517 - 14/11/2014 12:21:49

JABA
CABO FRIO
Cadast. em:Agosto/2005


Forma errada:

try
{
    //seu codigo;
}
catch (Exception ex)
{
    LogException(ex);
    throw ex;   //relança a exceção para um nível superior
}

Forma correta:

try
{
   //seu codigo;
}
catch (Exception ex)
{
    LogException(ex);
    
    throw;   //relança a exceção para um nível superior e preserva a pilha
}

_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



Resposta escolhida #442521 - 14/11/2014 13:22:27

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Citação:
:
Bom dia!
Criei um método publico para tratamento de erros, porém ele não está sendo eficiente. Trás muita informação (confusa) que as vezes mais atrapalha que ajuda e perco um bom tempo tentando localizar o problema.

Além disso, o Dot.Net não informa corretamente a linha onde o erro ocorreu (origem), mas sim a linha  Throw do método onde ocorreu e sua cadeia posterior.
Alguém conseguiu fazer um método publico que pudesse realmente ser eficiente e informar a linha exata do erro?

Abaixo segue o código que fiz, sendo sua chamada incluída em cada exception no sistema.
public static string MontaDadosDaExcecao(Exception ex, string myTextoAviso)
        {
            StringBuilder str = new StringBuilder();
            str.AppendLine("ERRO Em Try... Catch.");
            str.AppendLine("*********************************************************************************");
            str.AppendLine("");
            str.AppendLine("Message        : " + ex.Message);
            str.AppendLine("Source         : " + ex.Source);
            str.AppendLine("HelpLink       : " + ex.HelpLink);
            str.AppendLine("TargetSite     : " + ex.TargetSite);
            str.AppendLine("Inner Exception: " + ex.InnerException);
            str.AppendLine("Stack Trace    : " + ex.StackTrace);
            str.AppendLine("Data           : ");
            if (ex.Data != null)
            {
                // precisa de using System.Collections;
                foreach (DictionaryEntry de in ex.Data)
                {
                    str.AppendLine("Chave: " + de.Key + "   -   Valor: " + de.Value);
                }
            }
            return str.ToString();
        }  



Tenta aí :

public static string MontaDadosDaExcecao(Exception ex, string myTextoAviso)
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);      
{
            StringBuilder str = new StringBuilder();
            str.AppendLine("ERRO Em Try... Catch.");
            str.AppendLine("*********************************************************************************");
            str.AppendLine("");
            str.AppendLine("Message        : " + ex.Message);
            str.AppendLine("Source         : " + ex.Source);
            str.AppendLine("HelpLink       : " + ex.HelpLink);
            str.AppendLine("TargetSite     : " + ex.TargetSite);
            str.AppendLine("Inner Exception: " + ex.InnerException);
            str.AppendLine("Stack Trace    : " + ex.StackTrace);
            str.AppendLine("Linha          :" + trace.GetFrame(0).GetFileLineNumber());
            str.AppendLine("Data           : ");
            if (ex.Data != null)
            {
                // precisa de using System.Collections;
                foreach (DictionaryEntry de in ex.Data)
                {
                    str.AppendLine("Chave: " + de.Key + "   -   Valor: " + de.Value);
                }
            }
            return str.ToString();
        }  




Grupo DotNet.Br no FaceBook

Grupo WhatsDev



#442533 - 14/11/2014 15:27:47

LUIS HERRERA
NOVA ODESSA
Cadast. em:Julho/2005


Jaba obrigado, já havia corrigido isso fazem alguns meses.

FoxMan eu incluí sua sugestão, mas o número da linha é o mesmo exibido pelo StackTrace, porém fica muito mais visível assim que localizar no meu de vários itens, obrigado

Agradeço a todos pela ajuda. Eliminei alguns itens dessa mensagem, o que retirou um pouco a poluição visual, além de informações repetidas ou que nunca eram exibidas.

LH
Preserve a Natureza
Faça Coleta Seletiva e Cuide da Fauna e Flora por onde passa ou vive.
Dedique um tempo ao seu espírito, mente sã e corpo são.
Você e sua famí­lia serão os maiores beneficiado.

 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por LUIS HERRERA em 14/11/2014 15:28:49