Dev (Back & Front)ARTIGO

Detectando erro a todo custo

Olá, pessoal! Hoje veremos uma técnica para detectar erro de uma aplicação a todo custo.

Detectar todo tipo de erro dentro de um sistema é muito importante, pois é 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 se perguntando como fazer 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 e exemplificar na prática e no desenvolvimento.

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. Eu sempre defendi o uso de documentação, mas acabei entrando em uma empresa onde isso não existe e tudo é para 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. Se você já passou por isso, vai concordar que 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 é 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. Existem casos que o erro até loga no banco de dados, 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 é, para saber direito o que o sistema faz, é necessário fazer engenharia reversa do código, o que, na minha opinião, é uma das piores coisas que existem na programação!

Quando não existe solução, ou não há 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:

protected void Application_Error(object sender, EventArgs e)<br /><br />        {<br />            HttpContext ctx = HttpContext.Current;<br /><br />            Exception exception = ctx.Server.GetLastError();<br /><br />            StringBuilder str = new StringBuilder();<br />            str.Append("Error: "+exception.Message.ToString());<br />            str.Append("\r\n Details: "+ exception.InnerException.Message.ToString());<br />            str.Append("\r\n URL: " + Request.Url.AbsoluteUri.ToString());<br />            str.Append("\r\n Stack Trace: " + exception.InnerException.StackTrace.ToString());<br />            str.Append("\r\n Request Host: " + Request.UserHostAddress.ToString());<br />            str.Append("\r\n Host Name: " + Request.UserHostName.ToString());<br />            str.Append("\r\n User Agent: " + Request.UserAgent.ToString());<br />            str.Append("\r\n URL Referrer: " + Request.UrlReferrer.ToString());<br />            str.Append("\r\n UserName:  " + Request.LogonUserIdentity.Name.ToString());<br />            str.Append("\r\n Method: " + exception.TargetSite.ToString());<br />            str.Append("\r\n Source: " + exception.Source.ToString());<br /><br />            // Compose Email<br />            MailMessage msg = new MailMessage();<br /><br />            msg.From = new MailAddress("email automatico do sistema");<br />            msg.To.Add("seu-email");<br />            msg.Subject = "Error occurred in personal website application";<br />            msg.IsBodyHtml = true;<br />            msg.Body = str.ToString();<br /><br />            SmtpClient smtp = new SmtpClient();<br />            smtp.Send(msg);<br /><br />            String LogName = "Application";<br />            if (!EventLog.SourceExists(LogName))<br />            {<br />                EventLog.CreateEventSource(LogName, LogName);<br />            } <br /><br /> // Insert into Event Log<br />            EventLog Log = new EventLog();<br />            Log.Source = LogName;<br />            Log.WriteEntry(str.ToString(), EventLogEntryType.Error);<br /><br />            ctx.Server.ClearError();<br /><br />        }

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:

HttpContext ctx = HttpContext.Current;<br /><br />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ê:

 StringBuilder str = new StringBuilder();<br />            str.Append("Error: "+exception.Message.ToString());<br />            str.Append("\r\n Details: "+ exception.InnerException.Message.ToString());<br />            str.Append("\r\n URL: " + Request.Url.AbsoluteUri.ToString());<br />            str.Append("\r\n Stack Trace: " + exception.InnerException.StackTrace.ToString());<br />            str.Append("\r\n Request Host: " + Request.UserHostAddress.ToString());<br />            str.Append("\r\n Host Name: " + Request.UserHostName.ToString());<br />            str.Append("\r\n User Agent: " + Request.UserAgent.ToString());<br />            str.Append("\r\n URL Referrer: " + Request.UrlReferrer.ToString());<br />            str.Append("\r\n UserName:  " + Request.LogonUserIdentity.Name.ToString());<br />            str.Append("\r\n Method: " + exception.TargetSite.ToString());<br />            str.Append("\r\n Source: " + exception.Source.ToString());

Code 1.4

Nesse código eu peguei Erro, Detalhes do erro, Stack Trace, Request Host (de onde veio), usuário, url referente, método que ocorreu o problema e fonte. Depois de separar todos os erros possíveis, é necessário enviar e-mail ou gravar em eventview.

    MailMessage msg = new MailMessage();<br />            msg.From = new MailAddress("email automatico do sistema");<br />            msg.To.Add("seu-email");<br />            msg.Subject = "Error occurred in personal website application";<br />            msg.IsBodyHtml = true;<br />            msg.Body = str.ToString();<br /><br />            SmtpClient smtp = new SmtpClient();<br />            smtp.Send(msg);<br /><br />            String LogName = "Application";<br />            if (!EventLog.SourceExists(LogName))<br />            {<br />                EventLog.CreateEventSource(LogName, LogName);<br />            }<br />            EventLog Log = new EventLog();<br />            Log.Source = LogName;<br />            Log.WriteEntry(str.ToString(), EventLogEntryType.Error);

Code 1.5

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

Para finalizar, apago o erro do servidor:

ctx.Server.ClearError();

Code 1.6

 

Espero que tenha ficado claro. Qualquer coisa, entre em contato.

Com mais de 20 anos trabalhando no mercado de tecnologia. Mestre em Engenharia Elétrica voltada para o mundo mobile, com mais de 20 livros publicados e cerca de 700 artigos publicados com intuito de ajudar àqueles que querem aprender a programar (site, software, desktop, serviços, api e mobile). Site pessoal: https://www.mauriciojunior.net - MVP, MCAD, MCP Microsoft

Ver perfil