TRATAMENTO DE ERROS EFICIENTE
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.
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();
}
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:
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 .....
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.
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.
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?
Como você sugere que eu altere esse código?
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.
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.
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
}
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
}
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();
}
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.
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.
Tópico encerrado , respostas não são mais permitidas