thiserror
thiserror deriva Display, Error e From para enums de erro - padrão para crates de biblioteca.
Receita
[dependencies]
thiserror = "2"use thiserror::Error;
#[derive(Debug, Error)]
enum ConfigError {
#[error("erro de io: {0}")]
Io(#[from] std::io::Error),
#[error("porta inválida: {0}")]
Parse(#[from] std::num::ParseIntError),
}Quando usar: Tipos de erro de biblioteca pública com o mínimo de código repetitivo.
Exemplo de Trabalho
fn load(path: &str) -> Result<u16, ConfigError> {
let s = std::fs::read_to_string(path)?;
Ok(s.trim().parse()?)
}
fn main() {
if let Err(e) = load("port.txt") {
eprintln!("{e}");
if let Some(src) = std::error::Error::source(&e) {
eprintln!("causado por: {src}");
}
}
}O que isso demonstra:
#[from]gera implementaçõesFrom#[error("...")]formataDisplayError::sourceencadeia erros subjacentes
Mergulho Profundo
Suporta #[error(transparent)] para variantes de wrapper e campos de backtrace personalizados (opcional).
Armadilhas
- thiserror apenas em binários - Exagero vs anyhow. Correção: anyhow para aplicativos, thiserror para bibliotecas.
- Derivação de formato Display - Alterar
#[error]é semver para leitores humanos. Correção: Trate as mensagens como API cuidadosamente. Fromausente para uma variante - Implementação manual necessária. Correção: Adicione#[from]ou implemente manualmente.- Derivação grande em muitas variantes - Tempo de compilação. Correção: Divida hierarquias de erro.
- Combinando com anyhow - Converta na fronteira:
map_err(Into::into).
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Implementação manual de Error | Sem dependência de proc-macro | thiserror disponível |
snafu | Atributos de contexto estruturados | O padrão da equipe é thiserror |
anyhow | Aplicação | API pública da biblioteca |
FAQs
thiserror 1 vs 2?
Use 2.x para novos projetos por manifesto.no_std?
thiserror suporta no_std com features.campo de backtrace?
Opcional com tipo `Backtrace` no enum.variante transparente?
Encaminha Display/source para o interior.enum vs struct?
Variantes de enum são o padrão mais comum.combinar erros?
Múltiplas variantes `#[from]`.serde em erros?
Geralmente pule a serialização de erros.clippy?
Compatível com lints padrão.wasm?
Funciona em alvos wasm32.vs anyhow derive?
anyhow não é para enums de erro públicos.Relacionados
Versões da pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.