🎯 Objetivo: Neste capítulo, você aprenderá como o C# trata situações inesperadas que ocorrem durante a execução de um programa, conhecidas como exceções. Isso permite que você escreva programas mais seguros, robustos e controlados.


⚠️ O que é uma Exceção?

Imagine que seu programa é uma receita de bolo. Tudo está indo bem até que, de repente, você tenta adicionar "leite" mas o pote está vazio. Isso é uma situação inesperada que impede você de continuar a receita. Em programação, uma exceção representa exatamente isso: um evento que ocorre durante a execução de um programa e que perturba o seu fluxo normal. Se não for tratada, uma exceção pode fazer seu programa parar abruptamente (cair).

Exemplos Comuns de Exceções:


💣 Exemplo Sem Tratamento: O Programa Quebra

Quando uma exceção não é tratada, o C# Runtime a "lança" (throws), o programa para e uma mensagem de erro (stack trace) é exibida no console.

public class ExemploErroSemTratamento
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Iniciando o programa...");

        int[] numeros = { 10, 20, 30 };
        // Tentamos acessar a posição 5 de um array de tamanho 3
        Console.WriteLine(numeros[5]); // Isso causará uma IndexOutOfRangeException!

        Console.WriteLine("Esta linha nunca será executada."); // O programa já parou
    }
}

Saída (Exemplo de Stack Trace):

Iniciando o programa...
Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at ExemploErroSemTratamento.Main(String[] args) in C:\...\ExemploErroSemTratamento.cs:line 8

Como você pode ver, o programa para na linha 8 e exibe uma longa mensagem de erro. Isso não é uma boa experiência para o usuário!


🧯 Tratamento com try e catch

Para evitar que seu programa "quebre" ao encontrar uma exceção, você pode usar os blocos try e catch. Eles permitem que você tente executar um bloco de código que pode causar uma exceção e, se uma exceção ocorrer, capture-a e execute um "plano B" (o código de tratamento).

public class TratamentoBasicoExcecao
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Iniciando tratamento de exceção...");

        try
        {
            // Código que pode gerar uma exceção
            int[] numeros = { 10, 20, 30 };
            Console.WriteLine("Tentando acessar indice 5: " + numeros[5]); // Pode lançar IndexOutOfRangeException
            Console.WriteLine("Esta linha não será executada se a exceção acima ocorrer.");
        }
        catch (IndexOutOfRangeException e)
        {
            // Código que será executado se uma IndexOutOfRangeException for capturada
            Console.WriteLine("ERRO: Você tentou acessar uma posição que não existe no array.");
            Console.WriteLine("Detalhes técnicos: " + e.Message); // Exibe a mensagem da exceção
            // Console.WriteLine(e.StackTrace); // Útil para depuração, imprime o stack trace completo
        }

        Console.WriteLine("Programa continuou após o tratamento da exceção.");
        // O programa não parou!
    }
}

Saída