Reportador de Erros
Descrição do artigo publicado no aspneti.com, cada artigo com seu resumo
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.
Related articles
Avoid hackers and crackers from submitting data to your system by creating your captcha
Step by step here with me
How to get data from AppSettings.json?
In practice, many ways to do it.
Fabio