Reportador de Erros

Neste artigo vou demonstrar o que muitos desenvolvedores só vão ver quando acontece, o famoso erro no código, não o do tipo que ocorre em tempo de compilação, pois esse o compilador ainda detecta, mas aquele no qual possui uma entrada de dados inválida pelo usuário.

Podemos utilizar o tratamento de erros com o Try, Cacth e finally, tratando no servidor, para n√£o mostrar aquele erro "bruxo", em que o usu√°rio n√£o sabe o que vai fazer, e ainda colocar as valida√ß√Ķes necess√°rias tratando no cliente tamb√©m, mas por mais que o sistema seja testado, pode haver erros. Mas como iremos saber desses erros, esperar que o usu√°rio nos informe? N√£o, pois agora temos recursos no .NET no arquivo de configura√ß√£o do projeto, o Global.asax, foi criado mais um m√©todo, o Application_Error. Este evento √© disparado no momento em que ocorre uma exce√ß√£o na aplica√ß√£o.

Dentro deste método vamos utilizar a propriedade GestLastError, que descreve o erro que ocorreu na página.

Vamos criar uma session para armazenar o erro e após redirecionar para outra página com a descrição do erro, e após envia-la por e-mail usando a classe nativa do .NET chamada System.Web.Mail.

Vamos ver o exemplo:

O arquivo Global.asax com a descrição de cada método:

using System;

using System.Collections;

using System.ComponentModel;

using System.Web;

using System.Web.SessionState;

namespace reportadordeerros

{

/// <summary>

/// Summary description for Global.

/// </summary>

public class Global : System.Web.HttpApplication

{

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.IContainer components = null;

public Global()

{

InitializeComponent();

}

protected void Application_Start(Object sender, EventArgs e)

{

√Č executado a primeira vez em que a aplica√ß√£o entra no ar

}

protected void Session_Start(Object sender, EventArgs e)

{

√Č executado toda a vez que o usu√°rio entrar na aplica√ß√£o

}

protected void Application_BeginRequest(Object sender, EventArgs e)

{

√Č executado a cada solicita√ß√£o

}

protected void Application_EndRequest(Object sender, EventArgs e)

{

√Č executado quando a aplica√ß√£o termina

}

protected void Application_AuthenticateRequest(Object sender, EventArgs e)

{

√Č utilizado pelo m√≥dulo de seguran√ßa e informa

Que est√° pronto para ser autenticado.

}

protected void Application_Error(Object sender, EventArgs e)

{

// este evento é disparado no momento em ocorre uma excessão na aplicação

//Server.GetLastError = descreve o erro que ocorreu na p√°gina

Session["erro"] = Server.GetLastError().InnerException.ToString();

//Vamos redirecionar para a p√°gina de erro

Response.Redirect("erro.aspx");

}

protected void Session_End(Object sender, EventArgs e)

{

√Č executado toda vez que usu√°rio sair da aplica√ß√£o.

}

protected void Application_End(Object sender, EventArgs e)

{

√Č executada quando a aplica√ß√£o √© encerrada ou alguma

Configuração alterada.

}

#region Web Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.components = new System.ComponentModel.Container();

}

#endregion

}

}

Nesta página vamos criar um session com o nome de teste, que no momento do carregamento da página será atribuido um texto a ela e um botão que terá a função de

Anular a session, e no evento on_Click do bot√£o vamos gerar o erro atribuindo a session, que possui valor nulo agora, para um TextBox.

Default.aspx

 

 

 

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

namespace reportadordeerros

{

/// <summary>

/// Summary description for WebForm1.

/// </summary>

public class WebForm1 : System.Web.UI.Page

{

protected System.Web.UI.WebControls.TextBox TextBox1;

protected System.Web.UI.WebControls.Button Button1;

private void Page_Load(object sender, System.EventArgs e)

{

// Put user code to initialize the page here

Session["teste"] = "Esta sess√£o vai causar um erro!";

}

#region Web Form Designer generated code

override protected void OnInit(EventArgs e)

{

//

// CODEGEN: This call is required by the ASP.NET Web Form Designer.

//

InitializeComponent();

base.OnInit(e);

}

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.Button1.Click += new System.EventHandler(this.Button1_Click);

this.Load += new System.EventHandler(this.Page_Load);

}

#endregion

private void Button1_Click(object sender, System.EventArgs e)

{

Session["teste"] = null;

TextBox1.Text = Session["teste"].ToString();

}

}

}

P√°gina erro.aspx, a qual ser√° redirecionada quando houver erro com a seguinte mensagem "OCORREU UM ERRO AO EXECUTAR ESTE PROCESSO, MAS J√Ā FOI ENCAMINHADO PARA O ADMINISTRADOR DO SISTEMA E EM BREVE ESTAR√Ā FUNCIONANDO CORRETAMENTE!".

Erro.aspx

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Web.Mail;

namespace reportadordeerros

{

/// <summary>

/// Summary description for erro.

/// </summary>

public class erro : System.Web.UI.Page

{

protected System.Web.UI.WebControls.Label Label1;

protected System.Web.UI.WebControls.Label Label2;

private void Page_Load(object sender, System.EventArgs e)

{

// Put user code to initialize the page here

if (!Page.IsPostBack)

{

//Instanciamos o método MailMessage

MailMessage msg = new MailMessage();

//Texto que vai no corpo do email

msg.Body = "Error: " + Session["erro"].ToString() + "<br>" + Request.Url;

//email de destino

msg.To = "fab_andre@destino.com";

//email de origem

msg.From = "fab_andre@origem.com";

//Assunto do email

msg.Subject = "Application Error **** R E P O R T A D O R DE E R R O S **** "+DateTime.Now;

//caso haja smtp que n√£o o local

// SmtpMail.SmtpServer = "smtp.unifra.br";

//enviando mensagem

SmtpMail.Send(msg);

Label2.Text = "Erro no sistema: <br>"+Session["erro"].ToString();

}

}

#region Web Form Designer generated code

override protected void OnInit(EventArgs e)

{

//

// CODEGEN: This call is required by the ASP.NET Web Form Designer.

//

InitializeComponent();

base.OnInit(e);

}

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.Load += new System.EventHandler(this.Page_Load);

}

#endregion

}

}

Bom aproveito pessoal e até a próxima.