panic! vs Erros Recuperáveis
Panics abortam o desenrolamento (ou estratégia de abortamento) para bugs ou estados irrecuperáveis. Result lida com falhas esperadas às quais os chamadores podem responder.
Receita
fn divide(a: i32, b: i32) -> Result<i32, &'static str> {
if b == 0 { Err("divisão por zero") } else { Ok(a / b) }
}
fn index_unchecked(v: &[i32], i: usize) -> i32 {
v[i] // entra em pânico se estiver fora dos limites - erro de programador se mal utilizado
}Quando usar isso: Result para I/O e validação; panic!/assert! para violações de invariantes e protótipo unwrap.
Exemplo de Trabalho
fn parse_config(s: &str) -> Result<u16, String> {
s.trim().parse::<u16>()
.map_err(|e| format!("porta inválida: {e}"))
}
fn main() {
match parse_config("8080") {
Ok(p) => println!("{p}"),
Err(e) => eprintln!("erro de configuração: {e}"),
}
}O que isso demonstra:
- Erro de configuração do usuário ->
Result - O chamador decide sair/tentar novamente
- Sem pânico para entrada inválida esperada
Mergulho Profundo
| Usar panic | Usar Result |
|---|---|
| Bug lógico, branch impossível | Rede inativa, entrada de usuário inválida |
assert! em testes | APIs públicas de bibliotecas |
unwrap em protótipo main | Servidores e bibliotecas |
std::panic::catch_unwind raramente em código de aplicativo - não para erros normais.
Armadilhas
unwrapem biblioteca - Causa pânico no thread do chamador. Correção: RetornarResult.- Panic para fluxo de controle - Caro e pouco claro. Correção:
ResultouOption. - Abort vs unwind -
panic=abortem release muda o desenrolamento. Correção: Conhecer as configurações de perfil. - Panic através da fronteira FFI - Indefinido a menos que capturado. Correção: Nunca entrar em pânico através de FFI.
- Indexação como padrão -
v[i]causa pânico. Correção:get(i)para índices de usuário.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Result | Recuperável | Impossível se os pré-requisitos forem atendidos |
Option | Ausência não é erro | Precisa de motivo da falha |
assert! / debug_assert! | Invariantes | Validação de entrada do usuário |
Tipos NonZero | Provar que não é zero no nível do tipo | Valores opcionais |
FAQs
panic em testes?
Esperado para testes `should_panic`.unwrap vs expect?
expect adiciona mensagem - ligeiramente melhor em binários.gancho de panic?
Personaliza o log antes do desenrolamento.panic no_std?
abort - geralmente sem suporte a desenrolamento.Iterator::unwrap?
Entra em pânico em None - usar apenas em pipelines confiáveis.Mutex envenenado?
PoisonError - frequentemente causa pânico ou recupera.panic OOM?
O alocador pode abortar - não pode ser capturado como Result.Clippy lints?
avisa sobre `unwrap`/`expect` em libs.Manipuladores HTTP?
Mapeia erros para códigos de status - sem pânico por requisição.Documentar panics?
Seção `# Panics` do rustdoc para APIs de pânico intencionais.Relacionados
- Noções Básicas de Tratamento de Erros
- O Operador ?
- Tipos de Erro Personalizados
- Cenários de Panic & Unwrap
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+.