anyhow
anyhow fornece anyhow::Result<T> e anexos de contexto para binários de aplicação onde a taxonomia de erros não faz parte da API pública.
Receita
[dependencies]
anyhow = "1"use anyhow::{Context, Result};
fn read_port(path: &str) -> Result<u16> {
let s = std::fs::read_to_string(path)
.with_context(|| format!("lendo {path}"))?; // Traduzido: "lendo {path}"
let port: u16 = s.trim().parse().context("parsing port")?; // Traduzido: "parsing port"
Ok(port)
}Quando usar isso: CLIs, servidores e binários - não tipos de erro de biblioteca publicados.
Exemplo de Trabalho
fn main() -> anyhow::Result<()> {
let port = read_port("PORT")?;
println!("port={port}");
Ok(())
}O que isso demonstra:
mainretornaanyhow::Result?propaga com cadeia de contexto- Tipo de erro único apaga especificidades na fronteira
Mergulho Profundo
anyhow::Error é Send + Sync + 'static, suporta downcasting em testes via downcast_ref.
Armadilhas
- anyhow na API pública da biblioteca - Consumidores não podem fazer correspondência de erros. Correção: enum
thiserror. - Confiar no texto Display em testes - Frágil. Correção: Downcast ou testes estruturados na fronteira.
- Alocação de closure de contexto -
with_context(|| ...)é preguiçoso. Correção: Usecontextpara strings estáticas. - Misturar anyhow e erros personalizados - Use
?comFromou.map_err(Into::into). - Sem backtrace por padrão - Habilite
RUST_BACKTRACE+ flags de feature do anyhow.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
thiserror | Crates de biblioteca | Ferramenta interna rápida |
eyre | Erros de aplicação similares | Equipe usa anyhow |
Box<dyn Error> | Dependência mínima | Cadeia de contexto desejada |
FAQs
Uso em biblioteca?
Evite em assinaturas públicas.Downcast?
`if let Some(e) = err.downcast_ref::<IoError>()`.macro ensure!?
Semelhante a assert com bail do anyhow.bail!?
Retorno antecipado com mensagem de erro.Exibição em cadeia?
Contexto imprime na cadeia de causas.async?
Funciona em main e fns async.wasm?
Suportado.vs eyre?
Similar; anyhow mais comum no ecossistema.Converter thiserror?
`?` para anyhow na fronteira da aplicação.Features?
backtrace é opcional.Relacionados
Versões da Stack: 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+.