TRATAMENTO DE ERROS EFICIENTE

LUIS.HERRERA 14/11/2014 07:51:00
#442502
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();
}
PROGRAMADORVB6 14/11/2014 10:36:35
#442505
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 .....
OCELOT 14/11/2014 11:34:02
#442509
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.
LUIS.HERRERA 14/11/2014 11:55:02
#442511
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?
JABA 14/11/2014 12:08:20
#442515
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.



JABA 14/11/2014 12:21:49
#442517
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
}
FOXMAN 14/11/2014 13:22:27
#442521
Resposta escolhida
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();
}

LUIS.HERRERA 14/11/2014 15:27:47
#442533
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.
Tópico encerrado , respostas não são mais permitidas