SE VUOI PRENDERE LA CERTIFICAZIONE PER QUESTO CORSO CLICCA QUI
Errori irreversibili con panic!
A volte, succedono cose brutte nel tuo codice e non c’è niente che puoi fare al riguardo. In questi casi, Rust ha il macro panic!. Ci sono due modi per causare un panic nella pratica: facendo un’azione che fa sì che il nostro codice panic (come accedere a un array oltre la fine) o chiamando esplicitamente il macro panic!. In entrambi i casi, causiamo un panic nel nostro programma. Per impostazione predefinita, questi panic stamperanno un messaggio di fallimento, faranno unwind, puliranno lo stack e si fermeranno. Tramite una variabile d’ambiente, è anche possibile fare in modo che Rust visualizzi la call stack quando si verifica un panic per rendere più facile individuare la fonte del panic.
Disfare lo stack o abortire in risposta a un panic
Per impostazione predefinita, quando si verifica un panic, il programma inizia a fare unwind, il che significa che Rust risale lo stack e pulisce i dati da ogni funzione che incontra. Tuttavia, questo processo di risalita e pulizia è molto lavoro. Quindi, Rust ti consente di scegliere l’alternativa di abortire immediatamente, il che termina il programma senza pulire.
La memoria che il programma stava utilizzando dovrà quindi essere pulita dal sistema operativo. Se nel tuo progetto hai bisogno di rendere il binario risultante più piccolo possibile, puoi passare dall’unwind all’abortire in caso di panic aggiungendo panic = ‘abort’ alle sezioni [profile] appropriate nel tuo file Cargo.toml. Ad esempio, se vuoi abortire in caso di panic in modalità release, aggiungi questo:
rust
[profile.release]
panic = 'abort'
Proviamo a chiamare panic! in un programma semplice:
rust
// Nome file: src/main.rs
[Questo codice fa panic!]
fn main() {
panic!("crash and burn");
}
Quando esegui il programma, vedrai qualcosa del genere:
less
$ cargo run
Compilazione del progetto panic v0.1.0 (file:///projects/panic)
Terminato dev [non ottimizzato + debuginfo] target(s) in 0.25s
Esecuzione di `target/debug/panic`
Il thread 'main' ha panic! a 'crash and burn', src/main.rs:2:5
Nota: eseguire con la variabile d'ambiente `RUST_BACKTRACE=1` per visualizzare una traccia completa
La chiamata a panic! causa il messaggio di errore contenuto nelle ultime due righe. La prima riga mostra il nostro messaggio di panic e il punto nel nostro codice sorgente in cui si è verificato il panic: src/main.rs:2:5 indica che è la seconda riga, quinto carattere del nostro file src/main.rs.
In questo caso, la riga indicata fa parte del nostro codice e se andiamo a quella riga, vediamo la chiamata al macro panic!. In altri casi, la chiamata a panic! potrebbe essere nel codice che il nostro codice chiama e il nome del file e il numero di riga segnalati dal messaggio di errore saranno del codice di qualcun altro in cui viene chiamato il macro panic!, non la riga del nostro codice che ha portato alla chiamata di panic!. Possiamo utilizzare la traccia delle funzioni da cui proviene la chiamata a panic! per capire la parte del nostro codice che sta causando il problema. Discuteremo delle tracce in più dettaglio dopo.