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 seu Cargo.toml.