Rust
Panics and Unwinds
Sök…
Introduktion
panic!
makro kan kallas för att avsluta snabbt (ofta jämförs, men subtilt annorlunda, med ett undantag på andra språk). Korrekt felhantering bör omfatta Result
, även om det här avsnittet bara diskuterar panic!
och dess koncept.
Anmärkningar
Panik orsakar inte alltid minnesläckor eller andra resursläckor. I själva verket bevarar panik vanligtvis RAII invarianter, kör destruktorerna (Drop implementations) av strukturer när stacken lossnar. Men om det finns en andra panik under denna process, avbryter programmet helt enkelt; vid den tiden är RAII invariantgarantier ogiltiga.
Försök att inte få panik
I Rust finns det två huvudmetoder för att indikera att något har gått fel i ett program: En funktion som returnerar en ( potentiellt anpassad ) Err(E)
, från typen Result<T, E>
och panic!
.
Panik är inte ett alternativ för undantag, som vanligtvis finns på andra språk. I Rust är panik att indikera att något har gått allvarligt fel och att det inte kan fortsätta. Här är ett exempel från Vec
källan för push
:
pub fn push(&mut self, value: T) {
// This will panic or abort if we would allocate > isize::MAX bytes
// or if the length increment would overflow for zero-sized types.
if self.len == self.buf.cap() {
self.buf.double();
}
...
}
Om vi har slut på minnet finns det inte mycket annat som Rust kan göra, så det kommer antingen att få panik (standardbeteendet) eller avbryta (som måste ställas in med en sammanställningsflagg).
Panik kommer att varva ner bunten, köra förstörare och se till att minnet är städat. Abort gör inte detta och förlitar sig på operativsystemet att rensa det ordentligt.
Försök att köra följande program både normalt och med
[profile.dev]
panic = "abort"
i din Cargo.toml
.
// main.rs
struct Foo(i32);
impl Drop for Foo {
fn drop(&mut self) {
println!("Dropping {:?}!", self.0);
}
}
fn main() {
let foo = Foo(1);
panic!("Aaaaaaahhhhh!");
}