Tratamento de exceções
O tratamento de exceções em C# é essencial para criar aplicações robustas, capazes de lidar com erros inesperados sem interromper a execução do programa de forma abrupta. O mecanismo utiliza as palavras-chave try, catch, finally e throw para capturar, tratar e relançar exceções durante a execução do código.
1. Estrutura Básica do Tratamento de Exceções
A estrutura típica para tratar exceções é:
try
{
// Código que pode lançar uma exceção
}
catch (TipoDaExcecao ex)
{
// Código para tratar a exceção
}
finally
{
// Código que SEMPRE será executado (opcional)
}
- O bloco
tryenvolve o código que pode gerar uma exceção. - O bloco
catchcaptura e trata a exceção de um tipo específico. - O bloco
finallyexecuta código de limpeza, independentemente de ter ocorrido exceção ou não (por exemplo, fechar ficheiros ou libertar recursos).
2. Exemplo Prático
public class ExceptionTest
{
static double SafeDivision(double x, double y)
{
if (y == 0)
throw new DivideByZeroException();
return x / y;
}
public static void Main()
{
double a = 98, b = 0;
try
{
double result = SafeDivision(a, b);
Console.WriteLine("{0} divided by {1} = {2}", a, b, result);
}
catch (DivideByZeroException)
{
Console.WriteLine("Tentativa de divisão por zero.");
}
finally
{
Console.WriteLine("Operação finalizada.");
}
}
}
Neste exemplo, a exceção DivideByZeroException é lançada e capturada, evitando que o programa seja encerrado abruptamente. O bloco finally é executado sempre, independentemente do resultado1.
3. Boas Práticas
- Capture exceções específicas primeiro: Trate sempre exceções mais específicas antes das genéricas, para garantir tratamentos adequados para cada situação.
- Evite capturar
Exceptionsem necessidade: Isso pode mascarar erros e dificultar a depuração. - Relance exceções corretamente: Para preservar a pilha de chamadas, use apenas
throw;ao relançar uma exceção, e nãothrow ex;. - Use o bloco
finallypara libertar recursos: Ideal para fechar conexões, ficheiros ou libertar memória, mesmo quando ocorre uma exceção.
4. Lançando Exceções Personalizadas
Podemos criar e lançar suas próprias exceções usando a palavra-chave throw:
if (nomeFicheiro == null)
throw new ArgumentNullException("nomeFicheiro não pode ser nulo");
5. Filtros de Exceção
É possível adicionar condições aos blocos catch para tratar exceções apenas quando uma condição for verdadeira:
catch (IOException ex) when (ex.Message.Contains("disco cheio"))
{
Console.WriteLine("Erro: disco cheio.");
}
Resumo
- Use
try-catch-finallypara tratar exceções de forma segura e controlada. - Capture exceções específicas e relance-as corretamente quando necessário.
- Utilize o bloco
finallypara garantir a libertação de recursos. - Evite usar exceções como parte do fluxo normal do programa.
