| Por Fábio Andre Barcelos fabioandre@unifra.br Sou graduado em Sistemas de Informação, atuo no desenvolvimento de aplicações usando.NET Framework, ASP.NET, ADO.NET, Web Services, com C#, SQL Server, Access. http://www.fbarcelos.hpg.com.br |
|
|
|
|
| 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.