C#:
Tratamento de erros

Como fazer:

Vamos começar com um bloco try-catch. É como colocar uma rede de segurança sob um equilibrista na corda bamba. Se escorregarem, eles não despencam—são pegos.

using System;

class ExemploTratamentoErro {
    static void Main() {
        try {
            int[] numeros = {1, 2, 3};
            Console.WriteLine(numeros[5]);  // Ops, índice fora dos limites!
        } catch (IndexOutOfRangeException e) {
            Console.WriteLine("Erro capturado: " + e.Message);
        }
    }
}

Saída de exemplo quando as coisas dão errado:

Erro capturado: Índice estava fora dos limites do array.

Agora adicionamos um bloco finally—é o que acontece não importa o quê, como pagar impostos.

try {
    // Código potencialmente problemático aqui
} catch (AlgumaExcecaoEspecífica e) {
    // Aqui se manuseia aquele erro específico
} finally {
    // Este código roda não importa o que aconteça acima
    Console.WriteLine("Isto sempre roda.");
}

Mergulho Profundo

O tratamento de erros está no C# desde seu nascimento. Com o tempo, ele evoluiu. Antigamente, programadores dependiam de códigos de retorno ou flags globais para sinalizar problemas—desajeitado e propenso a erros.

C# utiliza exceções, uma abordagem mais moderna. Uma exceção é lançada quando o inesperado acontece, assim como jogar uma bandeira na jogada no futebol. O tratamento estruturado de exceções com os blocos try, catch e finally torna o gerenciamento destes momentos mais claro e limpo do que as antigas verificações de erro.

Alternativas? Claro. Há o UnhandledExceptionEventHandler para exceções que escapam. Ou em código assíncrono, o tratamento de erros muda um pouco com objetos Task que carregam as suas próprias exceções.

Detalhes de implementação—semelhantes a letras miúdas—importam. Exceções podem ser custosas, derrubando o desempenho se lançadas à toa. Por isso, as usamos para casos excepcionais, não para controle lógico do dia a dia.

Veja Também