📊 Capítulo 16: Tratamento de Erros Idiomático
Especialização em Sistemas com Rust
🗺️ O Ecossistema Moderno de Erros: thiserror vs anyhow
flowchart TD
PROJ{"Qual o tipo do projeto Rust?"}
PROJ --> |"Biblioteca (Library / Crate)"| THISERROR["thiserror\n- Define tipos de erro customizados estritos com enum\n- Implementa std::error::Error automaticamente"]
PROJ --> |"Aplicação (Binary / CLI / API)"| ANYHOW["anyhow\n- anyhow::Result<T> flexível\n- Adiciona contexto rico com .context('Falha ao ler config')"]
style PROJ fill:#ede7f6,stroke:#512da8,stroke-width:2px
style THISERROR fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style ANYHOW fill:#fff3e0,stroke:#ff9800,stroke-width:2px
🎯 Slide 1: Criando Erros de Domínio com thiserror
use thiserror::Error;
#[derive(Error, Debug)]
pub enum BancoDadosError {
#[error("Conexão perdida com o host {0}")]
Desconectado(String),
#[error("Registro com ID {id} não encontrado")]
NaoEncontrado { id: u64 },
#[error("Erro de I/O subjacente")]
Io(#[from] std::io::Error), // Conversão automática via operador ?
}
🎯 Slide 2: Contexto Enriquecido em Aplicações com anyhow
use anyhow::{Context, Result};
fn inicializar_servidor() -> Result<()> {
let config = std::fs::read_to_string("config.toml")
.context("Não foi possível carregar o arquivo de configuração config.toml")?;
Ok(())
}
🎯 Slide 3: Panic vs Recoverable Error
-
panic!: Para bugs irrecuperáveis e violação de invariantes do programa (ex.: índice fora dos limites do array). Result<T, E>: Para todas as falhas operacionais normais e esperadas (arquivos não encontrados, rede indisponível).
🔗 Navegação do Capítulo 16
| 📖 Ler Conteúdo Completo | 🧠 Fazer Quiz | 💻 Ver Exemplos | 🧩 Exercícios |
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim