Desenvolvimento - C#

Detectando erro a todo custo

O autor mostra como detectar erro de uma aplicação a todo custo. Importante detectar todo tipo de erro dentro de um sistema, é uma forma de prevenir qualquer problema do software para o seu cliente, não importa como foi construído.

por Mauricio Junior



         Olá pessoal, gostaria de mostrar como detectar erro de uma aplicação a todo custo. Importante detectar todo tipo de erro dentro de um sistema, é uma forma de prevenir qualquer problema do software para o seu cliente, não importa como foi construído.

Referência:

- Visual Studio .NET

- Linguagem C#.NET

- Tecnologia: ASP.NET

         Você deve estar me perguntando: - como fazer isso e pra que serve isso? Pois é, a minha resposta é bem grande e precisa de mais de um documento para explicar, porém vou tentar resumir a todo custo e exemplificar na prática e no desenvolvimento.

         A minha experiência de desenvolvimento de software, desde quando comecei a programar sozinho com 14 anos até hoje aos quase 28 anos de idade, e programando em grupo; vários problemas se passaram e várias novas soluções.

         Não sei se o ser humano de hoje está muito difícil ou se antigamente era mais fácil conversar e fazer a pessoa te escutar, só sei que trabalhar em grupo; principalmente se o grupo fizer algo que não tem documentação nenhuma, é muito difícil. Como sempre defendi o uso de documentação, acabei entrando em uma empresa hoje que não existe isso e tudo é pra ontem. Mesmo assim, brigo e peço sempre a documentação a todos.

         Imagina pegar um sistema pela metade sem documentação, código ruim, feio e para finalizar o pessoal que fez saiu da empresa, já passou por isso? Dessa forma, o melhor mesmo é criar métodos que possam pegar o erro, caso ocorra.

         Primeiro de tudo, use sempre try catch e se possível finally.

Try{}Catch( Exception ex){}Finally{}

Code 1.1

         A segunda coisa é, procure sempre deixar uma camada para o erro no sistema, ou seja, caso ocorra o catch, melhor mesmo é identificar onde aconteceu o erro, mandar e-mail, logar em um arquivo ou deixar registrado no eventview do sistema operacional. Existe caso que até loga no banco de dados o erro, mas em minha opinião, acredito que não seja a melhor alternativa.

         Lembra da empresa que te falei que não tem documentação nenhuma? Pois é, voltando ao assunto, para saber direito o que o sistema faz, é necessário fazer engenharia reversa do código, uma das piores coisas que existem na programação. (minha opinião).

         Quando não existe solução, ou não tem tempo para verificar o código porque está dando erro em produção, o melhor mesmo é fazer uma solução genérica para pegar qualquer tipo de erro. Veja o Code 1.2.

protected void Application_Error(object sender, EventArgs e)

        {

            HttpContext ctx = HttpContext.Current;

            Exception exception = ctx.Server.GetLastError();

            StringBuilder str = new StringBuilder();

            str.Append("Error: "+exception.Message.ToString());

            str.Append("\r\n Details: "+ exception.InnerException.Message.ToString());

            str.Append("\r\n URL: " + Request.Url.AbsoluteUri.ToString());

            str.Append("\r\n Stack Trace: " + exception.InnerException.StackTrace.ToString());

            str.Append("\r\n Request Host: " + Request.UserHostAddress.ToString());

            str.Append("\r\n Host Name: " + Request.UserHostName.ToString());

            str.Append("\r\n User Agent: " + Request.UserAgent.ToString());

            str.Append("\r\n URL Referrer: " + Request.UrlReferrer.ToString());

            str.Append("\r\n UserName:  " + Request.LogonUserIdentity.Name.ToString());

            str.Append("\r\n Method: " + exception.TargetSite.ToString());

            str.Append("\r\n Source: " + exception.Source.ToString());

           

            // Compose Email

            MailMessage msg = new MailMessage();

            msg.From = new MailAddress("email automatico do sistema");

            msg.To.Add("seu-email");

            msg.Subject = "Error occurred in personal website application";

            msg.IsBodyHtml = true;

            msg.Body = str.ToString();

            SmtpClient smtp = new SmtpClient();

            smtp.Send(msg);

            String LogName = "Application";

            if (!EventLog.SourceExists(LogName))

            {

                EventLog.CreateEventSource(LogName, LogName);

            }

            // Insert into Event Log

            EventLog Log = new EventLog();

            Log.Source = LogName;

            Log.WriteEntry(str.ToString(), EventLogEntryType.Error);

            ctx.Server.ClearError();

        }

Code 1.2

         Mas lembre-se de uma coisa, qualquer tipo de erro o sistema vai pegar e mandar a você dependendo da forma que fizer.

         A primeira coisa que fiz foi pegar todos os erros da aplicação. (Code 1.3)

            HttpContext ctx = HttpContext.Current;

            Exception exception = ctx.Server.GetLastError();

Code 1.3

         O próximo passo foi dividir os erros para enviar ao administrador ou desenvolver, ou seja, você. (Code 1.4)

StringBuilder str = new StringBuilder();

            str.Append("Error: "+exception.Message.ToString());

            str.Append("\r\n Details: "+ exception.InnerException.Message.ToString());

            str.Append("\r\n URL: " + Request.Url.AbsoluteUri.ToString());

            str.Append("\r\n Stack Trace: " + exception.InnerException.StackTrace.ToString());

            str.Append("\r\n Request Host: " + Request.UserHostAddress.ToString());

            str.Append("\r\n Host Name: " + Request.UserHostName.ToString());

            str.Append("\r\n User Agent: " + Request.UserAgent.ToString());

            str.Append("\r\n URL Referrer: " + Request.UrlReferrer.ToString());

            str.Append("\r\n UserName:  " + Request.LogonUserIdentity.Name.ToString());

            str.Append("\r\n Method: " + exception.TargetSite.ToString());

            str.Append("\r\n Source: " + exception.Source.ToString());

Code 1.4

         Esse código eu peguei o Erro, Detalhes do erro, Stack Trace, Request Host (de onde veio), o usuário, url referente, método que ocorreu o problema e a fonte.

         Depois de separar todos os erros possíveis, é necessário enviar e-mail ou gravar em eventview.

            MailMessage msg = new MailMessage();

            msg.From = new MailAddress("email automatico do sistema");

            msg.To.Add("seu-email");

            msg.Subject = "Error occurred in personal website application";

            msg.IsBodyHtml = true;

            msg.Body = str.ToString();

            SmtpClient smtp = new SmtpClient();

            smtp.Send(msg);

            String LogName = "Application";

            if (!EventLog.SourceExists(LogName))

            {

                EventLog.CreateEventSource(LogName, LogName);

            }

            EventLog Log = new EventLog();

            Log.Source = LogName;

            Log.WriteEntry(str.ToString(), EventLogEntryType.Error);

Code 1.5

         Na referência 1.5 envio e-mail e gravo no eventview do sistema operacional.

         Para finalizar, apago o erro do servidor. (Code 1.6)

            ctx.Server.ClearError();

Code 1.6

Espero ter entendido, qualquer coisa entre em contato pelo site.

Mauricio Junior

Mauricio Junior - Formado pela Faculdade Anhanguera, Especialista pela FGV (Fundação Getúlio Vargas), Pós-Graduação em Docência Superior e cursando Mestrado na UNB Engenharia Elétrica; . Tenho 29 anos e possuo sete livros publicados pela editora Ciência Moderna e sou editor do Linha de Código.
Sou Certificado Microsoft MCP, MCAD e MVP, faço parte da comunidade ASPNETI.COM, onde publico artigos, vídeos, ebooks e livros Publico artigos, vídeos e podcast em outras comunidades. Trabalho como Analista de Sistemas / Desenvolvedor na empresa ATP S/A.
Blog:
blog.mauriciojunior.org
Site pessoal: www.mauriciojunior.org