Exceções de relançamento em C#

Resumo : neste tutorial, você aprenderá como relançar uma exceção em C# usando a throwinstrução.

Quando relançar exceções em C#

Em C#, você pode usar o try...catchbloco para capturar uma exceção no trybloco e tratá-la adequadamente no catchbloco.

Em alguns casos, você pode querer lançar novamente uma exceção depois de capturá-la no catchbloco.

Isso pode ser útil se você precisar registrar a exceção primeiro e depois propagá-la na pilha de chamadas, que você tratará em outro catchbloco.

O seguinte ilustra como relançar uma exceção:

try
{
    // Some code that might throw an exception
}
catch (Exception ex)
{
    // Handle the exception
    Console.WriteLine($"An exception occurred: {ex.Message}");

    // Rethrow the exception
    throw;
}Linguagem de código:  C#  ( cs )

Nesta sintaxe, o código no trybloco pode gerar uma exceção. Se ocorrer uma exceção, nós a trataremos no catchbloco.

No catchbloco, tratamos a exceção mostrando uma mensagem ao console e a relançámos usando a throwinstrução.

Exemplo de exceções de relançamento em C#

O exemplo a seguir demonstra como relançar uma exceção usando a throwinstrução:

static float Divide(int a, int b)
{
    return a / b;
}

try
{
    var result = Divide(10, 0);
}
catch (DivideByZeroException ex)
{
    Console.WriteLine(ex.Message);
    // rethrow the exception
    throw;
}Linguagem de código:  C#  ( cs )

Como funciona.

Primeiro, defina o Divide()método que retorna a divisão de dois inteiros.

Segundo, divida 10 por zero usando o Dividemétodo. No bloco catch, registramos a mensagem de exceção no console e lançamos novamente a mesma DivideByZeroExceptionexceção.

Capturando e relançando outra exceção

Às vezes, você deseja tratar uma exceção e envolvê-la em uma nova exceção e propagar a nova exceção na pilha de chamadas.

Para fazer isso, você usa a throwinstrução com a nova exceção e passa a exceção original para o parâmetro de exceção interno da nova exceção. Por exemplo:

static float Divide(int a, int b)
{
    return a / b;
}


try
{
    var result = Divide(10, 0);
}
catch (DivideByZeroException ex)
{
    Console.WriteLine(ex.Message);

    // rethrow the exception
    throw new ArithmeticException(ex.Message, ex);
}Linguagem de código:  C#  ( cs )

Neste exemplo, registramos a mensagem da DivideByZeroExceptionexceção no console.

Além disso, envolvemos o DivideByZeroExceptionem uma nova ArithmeticExceptionexceção atribuindo a DivideByZeroExceptionexceção à InnerExceptionpropriedade da ArithmeticExceptionexceção.

O seguinte mostra ArithmeticExceptionwith DivisionByZeroExceptioncomo a exceção interna:

Resumo

  • Relançar uma exceção quando quiser fazer algo como registrar em log antes de propagar a mesma exceção na pilha de chamadas.
  • Use a throwinstrução para relançar a mesma exceção.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *