Cenários de Panic & Unwrap
Panics indicam bugs ou estados irrecuperáveis. Substitua unwrap em caminhos falíveis por ? e erros tipados; reserve panics para violações de invariantes e testes.
Receita
// Antes
let port: u16 = env::var("PORT").unwrap().parse().unwrap();
// Depois
let port: u16 = env::var("PORT").context("PORT")?.parse().context("PORT parse")?;Exemplo de Trabalho
| Local | Substituir por |
|---|---|
Option::unwrap | ok_or, context, if let |
Result::unwrap | ? |
index fora dos limites | get retornando Option |
assert! em lib | Result ou debug_assert! |
pub fn get_user(id: UserId) -> Result<User, Error> {
repo.find(id)?.ok_or(Error::NotFound(id))
}Mergulho Profundo
catch_unwind apenas na fronteira FFI. panic=abort em produção altera o comportamento de desenrolamento. Backtrace: RUST_BACKTRACE=1.
Armadilhas
- unwrap em Default::default - entra em pânico por falta de configuração. Correção: sem Default; use
try_new. - expect sem mensagem - logs de produção opacos. Correção: expect significativo ou Result.
- panic em Drop - aborta durante o desenrolamento. Correção: Drop infalível.
- array[i] sem verificação - use
.get(i). - todo! no caminho de produção - remova antes do envio.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Operador ? | erros recuperáveis | verdadeiramente impossível se documentado |
unwrap_or_else | valor de fallback | contexto de erro necessário |
assert! | teste/invariante | validação de entrada do usuário |
FAQs
panic em testes?
#[should_panic] ou catch_unwind para testes de panic.
panic em main?
Imprime a cadeia anyhow; define saída não zero.
panic em axum?
O padrão pega e retorna 500; use Result para 4xx.
hook customizado?
std::panic::set_hook para logging; cuidado em sistemas embarcados.
abort vs unwind?
abort gera um binário menor; sem recuperação com catch_unwind.
encontrar unwraps?
rg '\.unwrap\(' e clippy unwrap_used.
política de biblioteca?
negar unwrap em caminhos públicos via clippy.
option expect?
ok_or mapeia para a variante de erro de domínio.
join panic?
O pânico da tarefa se propaga ao aguardar, a menos que seja capturado na tarefa.
pós-mortem?
Adicione um teste reproduzindo o caminho de pânico anterior.
Relacionados
- Regras de Tratamento de Erros
- Panic vs Erros Recuperáveis
- Anti-Padrões Comuns
- Snippets de Refatoração de Debugging
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+.