Contexto e Backtraces de Erro
Anexe contexto conforme os erros se propagam. Habilite backtraces (RUST_BACKTRACE=1) para pânicos e alguns tipos de erro para localizar as origens das falhas.
Receita
use anyhow::Context;
fn load(path: &str) -> anyhow::Result<String> {
std::fs::read_to_string(path)
.with_context(|| format!("falha ao ler a configuração em {path}"))
}Quando usar isso: Depuração de produção - saiba qual operação falhou, não apenas a causa de baixo nível.
Exemplo de Trabalho
fn pipeline(cfg_path: &str) -> anyhow::Result<u16> {
let raw = load(cfg_path)?;
let port: u16 = raw.trim().parse().context("a porta deve ser um inteiro")?;
Ok(port)
}
fn main() {
if let Err(e) = pipeline("missing.toml") {
eprintln!("Erro: {e:#}");
for cause in e.chain() {
eprintln!(" causado por: {cause}");
}
}
}O que isso demonstra:
- Mensagens de contexto em camadas
{e:#}exibição alternativa com causas- Iteração de cadeia para logs
Mergulho Profundo
A captura de std::backtrace::Backtrace em recursos nightly/stable varia - RUST_BACKTRACE=1 para pânicos. O recurso de backtrace do anyhow adiciona aos erros.
Armadilhas
- Contexto sem informação acionável - "falhou" é inútil. Correção: Inclua caminhos, IDs, nomes de operação.
- Registrando o mesmo erro em várias camadas - Ruído duplicado. Correção: Registre uma vez no limite com a cadeia.
- Backtrace em caminho quente - Captura cara. Correção: Capture apenas no erro, não no sucesso.
- Segredos no contexto - Tokens em caminhos. Correção: Redija campos sensíveis.
thiserrorsemsource- Cadeia quebrada. Correção: Atributo#[source]em variantes.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Rastreamento estruturado | Observabilidade de produção | CLI simples |
Contexto snafu | Contextos tipados | Simplicidade do anyhow |
Registro manual com match | Controle total | Verboso |
FAQs
Valores de RUST_BACKTRACE?
1 completo, variantes limitadas por documentação.Backtrace de pânico?
Sempre disponível com variável de ambiente.Backtrace de erro com anyhow?
Recurso de flag necessário.Erro de tracing!
Registre `%?` debug ou exiba a cadeia.Contexto serde?
Separado dos erros de parse do serde.#[source] thiserror?
Vincula a variante ao erro interno.Contexto em Option?
Use `ok_or_else` com contexto antes do ?.Backtraces em CI?
Habilite em falhas de teste para flakes.Backtrace em wasm?
Suporte limitado de plataforma.Segurança?
Não exponha caminhos internos aos usuários - mapeie na camada HTTP.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+.