Tiago Tartari, Microsoft MVP, SRE, Executivo e Especialista em Tecnologia
SRE

Como a notificação de FirstChanceException no C# pode prevenir perda de confiabilidade

publicado em 05 de abril de 2023
Tiago Tartari - Microsoft MVP
Resumo
Em um mundo cada vez mais digital, onde a tecnologia é um fator crítico para o sucesso dos negócios, não gerenciar as exceções de um programa pode ser a diferença entre acelerar ou inviabilizar seus resultados. A adoção de boas práticas, como a notificação de FirstChance Exception no C#, é fundamental para garantir a estabilidade e performance de suas aplicações e potencializar o sucesso de sua empresa.

Conteúdo

Como a notificação de FirstChanceException no C# pode prevenir perda de confiabilidade?

O gerenciamento adequado de exceções é essencial para garantir a estabilidade e a confiabilidade de um programa em C#. Quando exceções são tratadas adequadamente, elas não afetam negativamente a execução do programa. No entanto, se as exceções não forem tratadas adequadamente, elas podem causar interrupções no serviço e afetar a experiência do usuário. A notificação de FirstChanceException no C# é uma boa prática que pode ajudar a identificar erros de código independentemente de ser tratada posteriormente com blocos try/catch.

O que é a notificação FirstChanceException no C#?

Quando uma exceção é gerada em um programa em C#, o Common Language Runtime (CLR) tenta encontrar um manipulador de exceção adequado para tratá-la. Se não encontrar um manipulador, a exceção é considerada uma exceção de primeira chance. Se a exceção for tratada adequadamente por meio de um manipulador de exceção, o programa poderá continuar a executar normalmente. Em outras palavras, antes de encontrar um manipulador, o evento no domínio da aplicação – AppDomain.FirstChanceException – é disparado sem ônus ao programa. Se um manipulador for encontrado, o erro será tratado normalmente. Caso contrário, a exceção será lançada.

Como receber um evento de notificação FirstChanceException no C#?

Para receber notificações de exceção de primeira chance, é possível usar o evento AppDomain.FirstChanceException. Esse evento é acionado sempre que uma exceção de primeira chance é gerada e permite que você receba informações sobre a exceção. O evento é acionado para todas as exceções de primeira chance, independentemente de serem tratadas ou não.

O código abaixo tem como objetivo capturar exceções que possam ocorrer no programa e tratá-las adequadamente. Um evento é registrado para um manipulador de exceção do tipo FirstChanceException para monitorar qualquer exceção gerada durante a execução do programa. Em seguida, o código solicita ao usuário a entrada de dois números inteiros para realizar uma divisão, que é uma operação que pode gerar uma exceção em tempo de execução se o segundo número for igual a zero.

using System.Runtime.ExceptionServices;

AppDomain.CurrentDomain.FirstChanceException += delegate (object? sender, FirstChanceExceptionEventArgs eventArgs)
{
    Console.ForegroundColor = ConsoleColor.DarkRed;
    Console.WriteLine("FirstChanceException");
    Console.WriteLine([email protected]"Message: {eventArgs.Exception.Message}");
    Console.WriteLine([email protected]"Source: {eventArgs.Exception.Source}");
    Console.WriteLine([email protected]"Stack Trace: {eventArgs.Exception.StackTrace}");
};

Console.WriteLine("Informe um número.");
var n1 = int.Parse(Console.ReadLine()!);

Console.WriteLine("Informe outro número.");
var n2 = int.Parse(Console.ReadLine()!);

try
{
    Console.WriteLine((n1 / n2).ToString());
}
catch (Exception ex)
{
    Console.ForegroundColor = ConsoleColor.DarkGreen;
    Console.WriteLine("Exception Handler");
    
    Console.WriteLine([email protected]"Message: {ex.Message}");
    Console.WriteLine([email protected]"Source: {ex.Source}");
    Console.WriteLine([email protected]"Stack Trace: {ex.StackTrace}");
}

No exemplo acima, se o manipulador de exceções try/catch não fosse encontrado, a exceção ainda seria capturada e exibida em vermelho na tela. Entretanto, sem um manipulador adequado, a execução do programa seria interrompida abruptamente, o que poderia prejudicar a experiência do usuário e causar perda de confiabilidade no software.

Como a notificação de FirstChanceException no C# pode prevenir perda de confiabilidade

Agora, com o manipulador de erro implementado corretamente, além de termos o evento FirstChanceException disparado, o CLR é capaz de encontrar e utilizar um manipulador de exceção adequado para resolver o problema. Isso permite que o programa continue executando normalmente, sem a interrupção abrupta que poderia ocorrer sem o manipulador adequado.

Por que você deveria utilizar o FirstChanceException?

Como o evento é disparado antes do CLR encontrar um manipulador, você vai poder identificar o erro do código mais cedo, inclusive no caso de não ter um manipulador você mesmo assim fará log do erro, permitindo a ação rápida para não deixar um problema afetar a experiência do usuário e consequentemente a perda da confiabilidade. Resumidamente você pode ter as seguintes vantagens:

  • Identificação precoce de erros: Ao utilizar o evento FirstChanceException, é possível identificar os erros de código mais cedo, o que ajuda a prevenir interrupções abruptas na execução do programa e perda de confiabilidade.
  • Resolução rápida de problemas: Ao capturar as exceções no momento em que são lançadas, é possível resolver os problemas rapidamente antes que eles afetem negativamente a execução do programa.
  • Melhoria na experiência do usuário: Quando os erros são capturados e tratados adequadamente, os usuários podem continuar a utilizar o programa sem interrupções, o que melhora sua experiência e ajuda a prevenir a perda de confiabilidade.
  • Maior confiabilidade do programa: Ao utilizar o evento FirstChanceException, é possível prevenir a perda de confiabilidade em programas em C#, tornando-os mais robustos e confiáveis.
Gostou? Me ajude a impactar outras pessoas compartilhando esse post.
Tiago Tartari
Tiago Tartari

Ajudo executivos, times de negócios e especialistas técnicos a resolver problemas complexos utilizando a tecnologia como meio para potencializar resultados.