Skill de Tratamento de Erros
Design e refatorações de thiserror / anyhow - uma Skill de Agente para serviços e bibliotecas Rust 1.97.0.
O Que Esta Skill Faz
Refatora erros de string e cadeias de unwrap em enums thiserror em bibliotecas, anyhow::Result em binários, contexto via .context(), e mapeamentos IntoResponse do Axum. Adiciona implementações From e #[non_exhaustive] onde as APIs evoluem.
Quando Invocar
- PR introduz
unwrapno caminho de produção - Biblioteca expõe
Box<dyn Error> - HTTP 500 retorna mensagens internas brutas
- Migrando código legado de
failureouerror-chain
Entradas
| Entrada | Por quê |
|---|---|
| Tipo do Crate | política lib vs bin |
| Consumidores de erro | match vs propagar |
| Exposição HTTP | tabela de mapeamento de código de status |
| Política de backtrace | RUST_BACKTRACE em produção |
Saídas
- Módulo
error.rscom enums tipados mainretornandoanyhow::Result- Handler
Result<T, AppError>comIntoResponse - Casos de teste para redação de exibição de erro
Guardrails
- Bibliotecas nunca usam
anyhowem assinaturas públicas. - Sem
expectem libs - retorneResult. - Contexto nos limites das operações - "carregando configuração", não em cada linha.
- Redigir segredos em
Display- implementação manual quando necessário. - Um único enum de erro por crate quando prático - evitar fragmentação.
Receita
rg 'unwrap\(|expect\(' src/ --type rust
cargo clippy -- -D clippy::unwrap_used
cargo test error_Exemplo de Trabalho
use axum::{http::StatusCode, response::IntoResponse};
use thiserror::Error;
#[derive(Debug, Error)]
pub enum AppError {
#[error("não encontrado")]
NotFound,
#[error(transparent)]
Internal(#[from] anyhow::Error),
}
impl IntoResponse for AppError {
fn into_response(self) -> axum::response::Response {
let status = match self {
AppError::NotFound => StatusCode::NOT_FOUND,
AppError::Internal(_) => StatusCode::INTERNAL_SERVER_ERROR,
};
(status, self.to_string()).into_response()
}
}FAQs
anyhow em testes?
Tudo bem para testes de integração; testes unitários frequentemente afirmam variantes de erro específicas.
migração de snafu?
Incremental: novos módulos usam thiserror; envolve o legado nas fronteiras.
panic para violações de invariante?
Apenas bugs reais após validação; erros do usuário permanecem Result.
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+.