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
- LinguagemC#.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 catche 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, mandare-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 queo 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, StackTrace, 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 doservidor. (Code 1.6)
ctx.Server.ClearError(); |
Code 1.6
Espero ter entendido,qualquer coisa entre em contato pelo site.