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.

 

 

 

Dicas para quem está começando:
Veja os próximos eventos
que você não pode perder :

22/11/2008 SQL Launch -
Linhares - ES
Por : devASPNet


22/11/2008 SQL Launch- SQL Server 2008
Rio Paranaiba - Viçosa - MG
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Volta Redonda - RJ
Por : devASPNet


22/11/2008 SQL Launch- SQL Server 2008
Franca - SP
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Canoinhas - SC
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Tefé - AM
Por : devASPNet


25/11/2008 SQL Launch - SQL Server 2008
Rio de Janeiro - RJ
Por : devASPNet


27/11/2008 SQL Lauch- SQL Server 2008
São Paulo - SP
Por : devASPNet


28/11/2008 SQL Launch - SQL Server 2008
São Paulo - SP
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Pedro Leopoldo - MG
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Petropolis - RJ
Por : devASPNet


29/11/2008 SQL Launch
Floriano - PI
Por : devASPNet


29/11/2008 SQL Launch - SQL Server 2008
Rio de Janeiro - RJ
Por : devASPNet


29/11/2008 SQL Launch - SQL Server 2008
Natal - RN
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Santa Maria - RS
Por : devASPNet


29/11/2008 SQL Launch
Ituiutaba - MG
Por : devASPNet


5/12/2008 Cloud Computing e o Windows Azure
São Paulo - SP
Por : devASPNet


6/12/2008 SQL Server 2008 Community Launch
São Paulo - SP
Por : devASPNet

Leituras imperdíveis para quem está começando:

º Otimizando a performance no ASP.NET::..
º Criando objetos de paginação personalizados na grid::..
º Uma cesta de compras em ASP.NET::..
º Utilizando o Refresh de parâmetros no .NET::..
º ASP.NET FORMS Authentication::..
º Utilizando propriedades dinâmicas no .NET::..
º Corrigindo problemas de deleção em grid com paginação::..
º Cuidado com os componentes de validação::..
º Otimizando o InitializeComponent::..
º Movendo fonte de aplicações entre máquinas::..
º Agilizando a performance da IDE do VS.NET::..
º Utilizando Short Circuit no VB.NET::..


























  Parceiros:
20% de desconto para os membros do grupo na aquisição de livros e inscrição para eventos

Receba dicas de programação e programação .NET:
E-mail:
Incluir Excluir