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.