TRATAMENTO DE ERROS COM LOG

LUIS.HERRERA 22/07/2014 17:02:22
#439744
Amigos boa tarde.
Estava deixando isso para depois, mas já estou enfrentando muitos problemas mesmo durante o desenvolvimento (Depuração).

Pesquisei, mas até agora só encontrei para ASP http://csharpbrasil.com.br/csharp/tratando-erros-no-csharp/, só que minha aplicação é Windows Forms.

Como criar um tratamento de erro com log padrão para todos os métodos, eventos, etc... do aplicativo?
Em VB6 tinha uma função que recebia de cada método/evento o nome da mesma, nome do form, linha e mensagem do erro. Nela eu gerava uma mensagebox ao usuário, criava o log.txt e enviava por email.

Em C# por existir as exception, não estou sabendo como montar isso, e durante a depuração do código recebo as mensagens de erro, mas não sei em que parte do programa está ocorrendo, se num método/evento do form, na camada BLL ou na camada DAL. Ai tenho de ir rastreando todo código desde o início até encontrar o problema, que as vezes passa por inúmeras rotinas até chegar no ponto do erro.

Amigos preciso apenas identificar o ponto exato do problema: Form ou Classe, nome do método/evento. linha do erro e descrição. O resto (gerar txt e email) eu sei como fazer. Se alguém puder ajudar agradeço.

JABA 22/07/2014 19:13:22
#439746
Resposta escolhida
try
{
FacaAlgumaCoisa();
}
catch (ArgumentNullException ex)
{
GravaLogException(ex);

throw; //relança a exceção para um nível superior e preserva a pilha
}

http://www.macoratti.net/13/07/c_excep.htm
LUIS.HERRERA 23/07/2014 08:46:02
#439755
Jaba excelente artigo, ainda não havia encontrado ele. Obrigado.

Mas após ler tudo surgiram 2 dúvidas:
Na parte que explica como Capturar Exceções não tratadas no código, (transcrito abaixo), diz para incluir um delegate no primeiro form chamado pela aplicação.

1) Esse código deve ser criado (repetido) em TODOS os Forms do aplicativo ou só no form 1 principal? Acho que deve estar em todos é isso?

2) No texto diz que TODAS as exceções serão capturadas por ele. Então até as tratadas pelo Try Cacth também serão capturadas? Nesse caso seriam capturadas 2 vezes, pelo Try Cacth e pelo Thread desse código.

  Crie uma aplicação Windows forms que contenha apenas um controle Button e declare no arquivo Program.cs :

using System;
using System.Windows.Forms;

namespace WinFormsExceptions
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
//Este código deve ser executado antes de criar qualquer elemento da UI
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}


No formulário form1.cs declare o seguinte código:

using System.Text;
using System.Windows.Forms;

namespace WinFormsExceptions
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//trata qualquer exceção que ocorra nesta thread
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
}

void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine([Ô]Trapped unhandled exception[Ô]);
sb.AppendLine(e.Exception.ToString());
MessageBox.Show(sb.ToString());
}

private void button1_Click(object sender, System.EventArgs e)
{
throw new System.InvalidOperationException([Ô]Deu Pau...[Ô]);
}
}
}

JABA 23/07/2014 11:59:07
#439770
Citação:

1) Esse código deve ser criado (repetido) em TODOS os Forms do aplicativo ou só no form 1 principal? Acho que deve estar em todos é isso?



Sim, é preciso estar em todos os Forms. Uma forma pra contornar isso é você criar um formulário padrão com esse modelo, e depois herdar a partir dele.

Citação:

2) No texto diz que TODAS as exceções serão capturadas por ele. Então até as tratadas pelo Try Cacth também serão capturadas? Nesse caso seriam capturadas 2 vezes, pelo Try Cacth e pelo Thread desse código.



Pelo que eu entendi, as exceções só chegará nele senão for capturadas pelo Try Catch. Ou seja, somente aquelas que não foram tratadas por um [Ô]try catch[Ô] na sua aplicação.
Tópico encerrado , respostas não são mais permitidas