Zoeken…


Invoering

Wanneer Rust-programma's een toestand bereiken waarin zich een kritieke fout heeft voorgedaan, is de panic! macro kan worden opgeroepen om snel af te sluiten (vaak vergeleken, maar subtiel anders, op een uitzondering in andere talen). Juiste foutafhandeling moet betrekking hebben op Result , hoewel in dit gedeelte alleen panic! wordt besproken panic! en zijn concepten.

Opmerkingen

Paniek veroorzaakt niet altijd geheugenlekken of andere bronnen van bronnen. In feite behouden panics doorgaans RAII-invarianten, waarbij de destructors (Drop-implementaties) van structs worden uitgevoerd terwijl de stapel afwikkelt. Als er echter een tweede paniek is tijdens dit proces, wordt het programma eenvoudig afgebroken; op dat moment zijn RAII invariante garanties ongeldig.

Probeer niet in paniek te raken

In Rust zijn er twee hoofdmethoden om aan te geven dat er iets mis is gegaan in een programma: een functie die een ( mogelijk door de gebruiker gedefinieerde ) Err(E) retourneert, van het type Result<T, E> en panic! .

Paniek is geen alternatief voor uitzonderingen, die vaak in andere talen worden gevonden. In Rust is paniek om aan te geven dat er iets serieus mis is gegaan en dat het niet kan doorgaan. Hier is een voorbeeld uit de Vec bron voor 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();
    }
    ...
}

Als we onvoldoende geheugen hebben, kan Rust niet veel meer doen, dus het zal in paniek raken (het standaardgedrag) of afbreken (wat moet worden ingesteld met een compilatievlag).

Paniek zal de stapel afrollen, destructors uitvoeren en ervoor zorgen dat het geheugen wordt opgeruimd. Abort doet dit niet en vertrouwt op het besturingssysteem om het op te ruimen.

Probeer het volgende programma zowel normaal als met uit te voeren

[profile.dev]
panic = "abort"

in uw 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow