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 try envolve o código que pode gerar uma exceção.
  • O bloco catch captura e trata a exceção de um tipo específico.
  • O bloco finally executa 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 Exception sem 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ão throw ex;.
  • Use o bloco finally para 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-finally para tratar exceções de forma segura e controlada.
  • Capture exceções específicas e relance-as corretamente quando necessário.
  • Utilize o bloco finally para garantir a libertação de recursos.
  • Evite usar exceções como parte do fluxo normal do programa.