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)

{
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:


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ê:


 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


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();
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 eu envio e-mail e gravo no eventview do sistema operacional.
Para finalizar, apago o erro do servidor:


ctx.Server.ClearError();

Code 1.6"

Comentários

Postagens mais visitadas