Boas Práticas de Tratamento de Erros
Como Usar Esta Lista
- Bibliotecas: erros tipados. Aplicações:
anyhow/eyrericos em contexto. - Revise antes de adicionar
unwrapa caminhos de produção.
A - Bibliotecas
- Use
thiserrorpara enums de erro públicos. Variantes estáveis e comparáveis. - Implemente
Error + Display + Frompara fontes. Habilita cadeias com?. - Evite
anyhowem APIs públicas. Consumidores precisam de erros tipados. - Marque enums extensíveis com
#[non_exhaustive]. Evolução amigável a Semver. - Documente quais variantes são transitórias vs. permanentes. Lógica de retentativa depende disso.
B - Aplicações
- Use
anyhowoueyrena fronteira do binário. Anexe contexto liberalmente. - Retorne códigos de saída diferentes de zero de CLIs. Mapeie
Errpara o código 1+. - Registre a cadeia completa de erros uma vez na fronteira. Evite camadas de contexto duplicadas.
- Mapeie erros para status HTTP apenas nos manipuladores. Mantenha erros de domínio agnósticos ao transporte.
- Habilite backtraces em falhas de CI de staging.
RUST_BACKTRACE=1.
C - Panics e unwrap
- Sem
unwrapem caminhos falíveis de bibliotecas. RetorneResult. - Use
expectcom mensagem apenas quando o invariante for documentado. Testes e lógica provável. - Prefira
?a boilerplate dematch. Caminho feliz mais claro. - Use
debug_assert!para invariantes de desenvolvimento. Não validações de usuário. - Nunca cause panic através de FFI. Retorne códigos de erro.
D - Options e Results
-
Optionpara opcional,Resultpara falha. Não confunda. - Use combinadores antes de aninhamento profundo de
match. Legibilidade. - Colete iteradores
Resultcom consciência de interrupção. Documente a política de falha parcial. - Adicione contexto nas fronteiras das operações. Caminhos de arquivo, IDs de usuário, IDs de solicitação.
- Teste caminhos de erro, não apenas
Ok. Inclua testes de entrada inválida.
FAQs
Tipo de erro único para a aplicação?
`anyhow::Error` é comum - sim.Retentar quais erros?
Timeout de IO sim, erro de parse não.serde em erros?
Geralmente pule - erros não são serializados.erros sqlx/axum?
Converta na borda do manipulador.crate de logging?
`tracing::error` com `%?` ou cadeia de display.erros no no_std?
`thiserror` no_std ou enum customizado.Internacionalizar erros?
`Display` para usuários na camada de UI - códigos no núcleo.Testes de propriedade?
Gere entradas inválidas para caminhos `Result`.lint?
`clippy unwrap_used` nega em libs.Próximo?
Coleções e pipelines de iteradores.Relacionados
Versões de 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+.