Sök…


Introduktion

När Rust-program når ett tillstånd där ett kritiskt fel har inträffat, får 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!");
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow