O tratamento de exceções é um componente crítico de cada aplicativo de software. A última coisa que você quer que seus usuários vejam são erros, ou pior ainda, seu aplicativo falhando. Neste artigo, discutiremos como localizar e capturar todas as exceções em aplicativos C#. O .NET fornece várias maneiras diferentes de capturar exceções e exibir exceções não tratadas.

Tópicos deste artigo:

  • Capturando “Exceções de Primeira Chance”
  • Tratamento de exceções ASP.NET
    • Incluindo MVC, API da Web, WCF e ASP.NET Core
  • Eventos de exceção do .NET Framework
  • Localizar todas as exceções com o Retrace sem alterações de código
  • Visualizador de Eventos do Windows


Capturando “Exceções de Primeira Chance”

Se você quiser localizar e capturar todas as exceções em seu aplicativo, você precisa estar ciente de “Exceções de Primeira Chance”. Lançar uma exceção sem bloco de captura para manipulá-la é quando essa exceção ocorre.

O .NET Framework fornece um mecanismo fácil para assinar cada exceção lançada em seu código. Isso inclui exceções que são capturadas profundamente dentro de seu código que nunca são exibidas em qualquer lugar. Embora você não possa tecnicamente “capturar” todas as exceções em C#, você pode se inscrever em eventos do .NET Framework para que você possa registrar essas exceções. Encontrar essas exceções é uma ótima maneira de melhorar o desempenho e eliminar comportamentos inconvenientes de aplicativos.

Também é importante notar que as exceções de primeira chance podem incluir muito ruído. Algumas exceções acontecem porque se espera que ocorram, ou só podem ocorrer, como vários avisos quando um aplicativo é iniciado. Não se assuste se você vir um pouco desse ruído de repente se você começar a registrar todas essas exceções em C#.

Ao assinar o evento, você pode registrar todas as exceções para ajudar a identificar problemas estranhos e ocultos em seu aplicativo. Fazer isso a longo prazo em um aplicativo de produção não é recomendado devido ao grande volume de ruído e dados que ele pode causar. É melhor usado durante o desenvolvimento ou para ajudar a encontrar problemas de produção incômodos. Defina esse manipulador de eventos no início do aplicativo em Program.cs, Startup.cs ou no arquivo Global.asax.

AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
Debug.WriteLine(eventArgs.Exception.ToString());
};

ASP.NET Catch Todas as Exceções

Para ASP.NET aplicativos Web, você não pode impedir que os usuários recebam respostas de erro de servidor interno HTTP de nível 500 quando uma exceção é lançada em um ApiController. Como você pode lidar com isso depende se você está usando várias estruturas de ASP.NET ou ASP.NET Core. Para começar, certifique-se de habilitar erros personalizados no arquivo web.config para que os usuários nunca vejam páginas de exceção.

Inscreva-se no Evento de Application_Error Global.asax

Se o seu aplicativo tiver um Global.asax, que é essencialmente um HttpApplication, você deverá configurar eventos em torno de exceções não tratadas. É importante saber que, se você estiver usando MVC, Web API, Nancy, SerivceStack, WCF, etc., nem todas as exceções podem borbulhar para o seu manipulador de erros Global.asax. Essas estruturas específicas da Web também podem ter seus próprios mecanismos de tratamento de erros. Vamos cobrir os abaixo também!

//Global.asax
public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Error(object sender, EventArgs e)
    {
        Exception exception = Server.GetLastError();
        if (exception != null)
        {
            //log the error
        }
    }

    protected void Application_Start()
    {
        //may have some MVC registration stuff here or other code
    }
}

Tratamento de erros MVC

Com o MVC, você pode utilizar o HandleErrorAttribute para fazer o tratamento de erros personalizado por ação do controlador MVC. Ele também tem um evento OnException dentro do Controller. Em geral, você deve estar seguro com o tratamento de erros globais através do seu arquivo Global.asax para capturar todas as exceções.

Leia mais: Práticas recomendadas para tratamento de erros no MVC ASP.NET

Tratamento de erros de API da Web

A API da Web tem recursos mais avançados de tratamento de exceções que você precisa estar ciente.

  • O filtro Exceção – Capacidade de personalizar o tratamento de erros para controladores e ações específicos.
  • Registrador de exceções – Habilita o registro em log de todas as exceções não tratadas.
  • Manipulador de exceção – Manipulador global para personalizar a resposta de volta para a parte chamadora da sua API.

Um exemplo de uso do registrador de exceções não tratado:

public class UnhandledExceptionLogger : ExceptionLogger  
{
    public override void Log(ExceptionLoggerContext context)
    {
        var log = context.Exception.ToString();
        //Write the exception to your logs
    }
}

Em seguida, você precisa registrar seu registrador de exceções como parte da configuração de inicialização da API da Web.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        //Register it here
        config.Services.Replace(typeof(IExceptionLogger), new UnhandledExceptionLogger());

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Tratamento de erros do WCF

Como a API da Web, o WCF tem muitas opções de personalização em torno do tratamento de exceções. Se você estiver usando o WCF, é fundamental que você configure um IServiceBehavior e IErrorHandler para capturar todas as exceções corretamente. Confira este exemplo no CodeProject para obter a maneira correta de fazê-lo: WCF Global Exception Handling

Tratamento de erros principais do ASP.NET

Muita coisa mudou com ASP.NET Core. Um ExceptionFilterAttribute é usado para coletar exceções não tratadas. Você pode registrá-lo como um filtro global e ele funcionará como um manipulador de exceção global. Outra opção é usar um middleware personalizado projetado para não fazer nada além de capturar exceções não tratadas.

public class ErrorHandlingFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        var exception = context.Exception;
        //log your exception here

        context.ExceptionHandled = true; //optional 
    }
}

Você também deve registrar seu filtro como parte do código de inicialização.

//in Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc(options =>
    {
        options.Filters.Add(new ErrorHandlingFilter());
    });
}

Eventos de exceção do .NET Framework

O .NET Framework fornece alguns eventos que você pode usar para capturar exceções não tratadas. Você só precisa se registrar para esses eventos uma vez em seu código quando o aplicativo for iniciado. Por ASP.NET, você faria isso na classe Startup ou Global.asax. Para aplicativos do Windows, pode ser as primeiras linhas de código no método Main().

static void Main(string[] args)
{
  Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
  // Log the exception, display it, etc
  Debug.WriteLine(e.Exception.Message);
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
  // Log the exception, display it, etc
  Debug.WriteLine((e.ExceptionObject as Exception).Message);
}

**LEIA MAIS: Evento AppDomain.UnhandledException (MSDN)**

Localizar e capturar todas as exceções em C# com rerastreamento

Uma das grandes características do Retrace são seus recursos de monitoramento de erros. O Retrace pode coletar automaticamente todas as exceções do .NET que estão ocorrendo em seu aplicativo sem alterações de código. Isso inclui exceções não tratadas, mas também pode incluir todas as exceções lançadas ou exceções de primeira chance.

A melhor coisa sobre isso é que ele funciona com todos os tipos de aplicativos ASP.NET. Ele funciona perfeitamente com MVC, WCF, API da Web, .NET Core, etc.

O Retrace fornece excelentes relatórios sobre todas as suas exceções. Você pode até mesmo configurar alertas para altas taxas de exceção de aplicativos ou quando uma nova exceção for encontrada.

O Retrace oferece três modos:

  • Sem exceções
  • Somente exceções não tratadas
  • Todas as exceções lançadas – Use isso para capturar todas as exceções

Exibir exceções no Visualizador de Eventos do Windows

Se o aplicativo tiver exceções não tratadas, isso pode ser registrado no Visualizador de Eventos do Windows na categoria de “Aplicativo”. Isso pode ser útil se você não conseguir descobrir por que seu aplicativo falha de repente.

O Visualizador de Eventos do Windows pode registrar duas entradas diferentes para a mesma exceção. Um com um erro de Tempo de Execução do .NET e outro Erro de Aplicativo do Windows mais genérico.

Do .NET Runtime:

Application: Log4netTutorial.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IndexOutOfRangeException
   at Log4netTutorial.Program.Main(System.String[])

Registrado em Erro de aplicativo:

Faulting application name: Log4netTutorial.exe, version: 1.0.0.0, time stamp: 0x58f0ea6b
Faulting module name: KERNELBASE.dll, version: 10.0.14393.953, time stamp: 0x58ba586d
Exception code: 0xe0434352
Fault offset: 0x000da882
Faulting process id: 0x4c94
Faulting application start time: 0x01d2b533b3d60c50
Faulting application path: C:UsersmattDocumentsVisual Studio 2015ProjectsLog4netTutorialbinDebugLog4netTutorial.exe
Faulting module path: C:WINDOWSSystem32KERNELBASE.dll
Report Id: 86c5f5b9-9d0f-4fc4-a860-9457b90c2068
Faulting package full name: 
Faulting package-relative application ID: 

Resumo

Ter boas práticas recomendadas em torno de log e exceções é fundamental para todos os aplicativos de software. O registro em log é tipicamente os olhos e ouvidos do desenvolvedor. Neste guia, abordamos várias maneiras de localizar e capturar todas as exceções em C#. Certifique-se de verificar nossos guias de práticas recomendadas de tratamento de exceções e registro.

O Retrace by Netreo oferece aos desenvolvedores uma visibilidade inigualável do desempenho de seus aplicativos. Com o Retrace, localize todas as exceções de aplicativo e obtenha um rastreamento completo de transação do que acontece quando as exceções são lançadas.

COMECE SUA AVALIAÇÃO GRATUITA AGORA!