Resumo : neste tutorial, você aprenderá sobre exceções e como usar a try...catch
instrução C# para lidar com exceções.
Introdução à instrução try catch em C#
As exceções são erros de tempo de execução em um programa, que violam as restrições do sistema. Por exemplo, quando o programa tenta dividir um número por zero, ocorre uma exceção. Quando ocorre uma exceção, o sistema a captura e gera a exceção.
Se o programa não tratar a exceção corretamente, ele irá travar. Por exemplo, o programa a seguir irá travar devido a uma exceção:
int amount = 100;
int qty = 0;
int result = amount / qty;
Console.WriteLine(result);
Linguagem de código: C# ( cs )
Neste exemplo, o programa travou com a seguinte mensagem de erro:
System.DivideByZeroException: 'Attempted to divide by zero.'
Linguagem de código: C# ( cs )
Nesta mensagem de erro, o nome da exceção é System.DivideByZeroException
. E a mensagem de erro indica que o programa tentou dividir por zero.
Se você não lidar com exceções, os usuários verão mensagens de erro pouco amigáveis. O objetivo do tratamento de exceções é responder a uma exceção com uma das seguintes ações:
- Exiba uma mensagem amigável aos usuários e solicite que eles tomem ações corretivas para manter o programa funcionando corretamente.
- Registre as informações da exceção em um arquivo para que você possa resolvê-la posteriormente.
- Limpe quaisquer recursos externos, como conexões de banco de dados.
Para lidar com exceções, você usa a try...catch
instrução:
try
{
// statements to be guarded for exceptions
}
catch
{
// exception handler
}
Linguagem de código: C# ( cs )
Nesta sintaxe:
- Primeiro, coloque as instruções que você deseja proteger contra exceções no
try
bloco. - Segundo, forneça o manipulador de exceção no
catch
bloco para tratar a exceção.
Quando ocorre uma exceção no try
bloco, o controle do programa salta imediatamente para o catch
bloco.
O programa a seguir mostra como usar a try...catch
instrução para tratar a exceção:
int amount = 100;
int qty = 0;
try
{
int result = amount / qty;
Console.WriteLine(result);
}
catch
{
Console.WriteLine("The program was terminated due to an error.");
}
Console.WriteLine("Bye!");
Linguagem de código: C# ( cs )
Saída:
The program was terminated due to an error.
Bye!
Linguagem de código: C# ( cs )
Neste programa DivideByZeroException
ocorreu a exceção que fez com que o catch
bloco fosse executado e exibisse a mensagem de erro. O programa funcionou sem travar.
Se você souber o tipo exato de exceção, poderá especificá-lo no catch
bloco. Por exemplo:
int amount = 100;
int qty = 0;
try
{
int result = amount / qty;
Console.WriteLine(result);
}
catch(DivideByZeroException e)
{
Console.WriteLine("The program was terminated due to an error.");
Console.WriteLine($"Message: {e.Message}");
Console.WriteLine($"Source: {e.Source}");
Console.WriteLine($"Stack: {e.StackTrace}");
}
Console.WriteLine("Bye!");
Linguagem de código: C# ( cs )
Saída:
The program was terminated due to an error.
Message: Attempted to divide by zero.
Source: Program
Stack: at Program.<Main>$(String[] args) in D:\csharp\Program.cs:line 6
Bye!
Linguagem de código: C# ( cs )
Neste exemplo, o bloco catch capturou a DivideByZeroException
exceção e atribuiu uma instância à e
variável. O DivideByZeroException
objeto ( e
) possui informações detalhadas sobre a exceção como:
Message
– contém a mensagem de erro que explica a causa da exceção.Source
– contém o nome do assembly onde a exceção se originou.StackTrace
– descreve onde ocorreu a exceção.
Tipos de exceção
C# define muitas classes de exceção, cada uma representando um tipo específico. Todas as classes de exceção são derivadas da System.Exception
classe, que por sua vez é derivada da System.Object
classe.
A imagem a seguir ilustra a hierarquia de exceções:
Mais sobre a cláusula catch
A catch
cláusula trata exceções. Possui quatro formas.
1) Cláusula geral de captura
A cláusula geral catch
não possui uma lista de parâmetros da catch
palavra-chave. Corresponde a qualquer exceção levantada no try
bloco:
try
{
}
catch
{
}
Linguagem de código: C# ( cs )
2) Cláusula de captura específica
Uma catch
cláusula específica especifica o nome de uma classe de exceção como um único parâmetro. Corresponde a qualquer exceção com o nome que corresponde ao parâmetro:
try
{
// statement
}
catch (ExceptionType)
{
// handle exception with the ExceptionType
}
Linguagem de código: C# ( cs )
3) Cláusula catch específica com objeto
A catch
cláusula específica com um objeto inclui uma variável de exceção após o nome da classe de exceção. Esta variável de exceção faz referência ao objeto de exceção. Ao usar uma variável de exceção, você pode acessar informações específicas sobre a exceção.
try
{
// statement
}
catch (ExceptionType e)
{
// handle exception with the ExceptionType
}
Linguagem de código: C# ( cs )
4) Captura específica com predicado
A captura específica é como uma captura específica catch
com um objeto, mas também inclui um predicado. O catch
será executado somente se a condição no predicado for true
:
try
{
// statement
}
catch (ExceptionType e) where (predicate)
{
// handle exception with the ExceptionType
}
Linguagem de código: C# ( cs )
Resumo
- As exceções são erros de tempo de execução que ocorreram no programa.
- Use a
try...catch
instrução para lidar com exceções.