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 codeoverride 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 codeoverride 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.