C# Erros Intermediário
Exceções
Em C#, exceções são o mecanismo padrão para sinalizar e tratar erros em tempo de execução. Quando algo inesperado acontece, o código lança (throw) uma exceção; quem chamou pode capturá-la com try/catch e opcionalmente executar código de limpeza com finally.
O bloco try contém o código que pode falhar. Cada catch especifica o tipo de exceção que deseja tratar, permitindo tratamentos diferentes para erros diferentes. O bloco finally sempre executa, tenha havido exceção ou não, sendo ideal para liberar recursos.
Você pode criar exceções próprias herdando de Exception para representar erros específicos do seu domínio. Também pode usar filtros com when para capturar uma exceção apenas se uma condição for verdadeira, evitando catch genéricos e melhorando a legibilidade.
Neste card, veremos como combinar try, catch, finally, throw, exceções personalizadas e filtros when para escrever código robusto e expressivo.
Pontos-chave
trydelimita o código que pode lançar exceções;catchtrata tipos específicos;finallysempre executa.throwlança uma exceção;throw;dentro de umcatchrelança a exceção original preservando o stack trace.- Exceções próprias herdam de
Exception(ou de uma subclasse) e geralmente terminam comExceptionno nome. - Filtros com
whenpermitem capturar uma exceção somente se uma condição for verdadeira. - Capture as exceções mais específicas primeiro e evite
catch (Exception)genérico sem necessidade.
using System;
// Exceção personalizada para saldo insuficiente
public class SaldoInsuficienteException : Exception
{
public decimal SaldoAtual { get; }
public SaldoInsuficienteException(decimal saldoAtual)
: base($"Saldo insuficiente: {saldoAtual:C}")
{
SaldoAtual = saldoAtual;
}
}
public class ContaBancaria
{
public decimal Saldo { get; private set; }
public ContaBancaria(decimal saldoInicial) => Saldo = saldoInicial;
public void Sacar(decimal valor)
{
if (valor <= 0)
throw new ArgumentOutOfRangeException(nameof(valor), "Valor deve ser positivo");
if (valor > Saldo)
throw new SaldoInsuficienteException(Saldo);
Saldo -= valor;
}
}
class Program
{
static void Main()
{
var conta = new ContaBancaria(100m);
try
{
conta.Sacar(150m);
}
catch (SaldoInsuficienteException ex) when (ex.SaldoAtual < 200m)
{
Console.WriteLine($"Erro tratado: {ex.Message}");
}
catch (SaldoInsuficienteException ex)
{
Console.WriteLine($"Erro grave: {ex.Message}");
}
finally
{
Console.WriteLine("Operação finalizada.");
}
}
}