Pânicos (Panics)
Rust lida com erros fatais com um “pânico”.
O Rust irá disparar um panic (pânico) se um erro fatal ocorrer em tempo de execução:
fn main() { let v = vec![10, 20, 30]; println!("v[100]: {}", v[100]); }
- Pânicos são para erros irrecuperáveis e inesperados.
- Pânicos são sintomas de bugs no programa.
- Falhas em tempo de execução como verificações de limites falhadas podem disparar um pânico
- Asserções (como
assert!
) disparam um pânico em caso de falha - Pânicos com moticos específicos podem usar a macro
panic!
.
- Um pânico irá “desenrolar” a pilha, descartando valores como se as funções tivessem retornado.
- Use APIs que não disparam erros do tipo pânico (como
Vec::get
) se não for aceitável o travamento do programa.
This slide should take about 3 minutes.
Por padrão, um pânico causará a resolução da pilha. A resolução pode ser capturada:
use std::panic; fn main() { let result = panic::catch_unwind(|| "Nenhum problema aqui!"); println!("{result:?}"); let result = panic::catch_unwind(|| { panic!("ah não!"); }); println!("{result:?}"); }
- Capturar é incomum; não tente implementar exceções com
catch_unwind
! - Isso pode ser útil em servidores que devem continuar rodando mesmo se uma requisição tenha falhado.
- Isso não funciona se
panic = 'abort'
estiver definido em seuCargo.toml
.