try, catch e finally
ResumoExceções sinalizam erros em tempo de execução.
tryprotege um bloco,catchtrata tipos específicos de erro efinallyexecuta limpeza sempre — com ou sem exceção.
1. Objetivos de Aprendizagem#
- Capturar exceções por tipo.
- Usar
finallyeusingpara limpeza. - Filtrar exceções com
when.
2. Pré-requisitos#
- Classes e herança (Módulo 05).
3. Conceito#
Uma exceção é um objeto (derivado de System.Exception) lançado quando algo dá errado. O fluxo:
try— bloco que pode falhar.catch (TipoEx e)— trata um tipo específico; pode haver vários, do mais específico ao mais geral.finally— roda sempre (sucesso ou falha), ideal para liberar recursos.when— filtra o catch por condição.
O porquê: separar o caminho feliz do tratamento de erro, sem poluir a lógica com checagens a cada linha.
4. Mão na Massa#
4.1. Setup#
dotnet new console -n Catalog.Excecoes
cd Catalog.Excecoes
4.2. Implementação Passo a Passo#
- Captura por tipo +
finally:
try
{
var texto = "abc";
int numero = int.Parse(texto); // lança FormatException
}
catch (FormatException ex)
{
Console.WriteLine($"Entrada inválida: {ex.Message}");
}
catch (Exception ex) // rede de segurança (mais geral por último)
{
Console.WriteLine($"Erro inesperado: {ex.Message}");
}
finally
{
Console.WriteLine("Sempre executa (limpeza).");
}
when(filtro):
try { /* ... */ }
catch (IOException ex) when (ex.Message.Contains("disk"))
{
Console.WriteLine("Problema específico de disco.");
}
usingpara liberar recursos automaticamente:
using var arquivo = new StreamReader("dados.txt");
var conteudo = arquivo.ReadToEnd(); // Dispose chamado ao sair do escopo
4.3. Executando#
dotnet run
5. Exemplo Completo#
O bloco try/catch/finally acima trata FormatException de forma específica, mantém uma rede de segurança geral e garante a limpeza no finally.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
| Capturar o tipo mais específico primeiro | Só catch (Exception) engolindo tudo |
Usar using para IDisposable | Esquecer de liberar arquivos/conexões |
| Deixar exceções não recuperáveis subirem | catch vazio que esconde o problema |
Atençãoexceções são para situações excepcionais, não para controle de fluxo normal. Para entradas previsíveis, prefira
TryParsea capturarFormatException.
7. Segurança e Produção#
- Nunca engula exceções silenciosamente: registre (log) antes de decidir continuar. Erros invisíveis são os mais caros de diagnosticar.
8. Exercícios#
- Fácil: capture uma
DivideByZeroException. - Médio: use
finallypara imprimir uma mensagem de encerramento. - Desafio: use
catch whenpara tratar apenas um subconjunto de casos de uma mesma exceção.
9. Resumo#
try protege, catch trata por tipo (específico → geral), finally limpa sempre, when filtra. Use exceções para o excepcional e using para liberar recursos.
10. Próximos Passos#
A seguir, criar exceções próprias para o domínio.
11. Referências#
- Microsoft Learn — Tratamento de exceções
- Microsoft Learn — try-catch
- Microsoft Learn — using