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 JuniorOlá 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.