Rust:
Fouten afhandelen

Hoe te:

Rust gaat op twee belangrijke manieren om met fouten: herstelbare en onherstelbare fouten. Laten we beide bekijken.

Herstelbare fouten gebruiken Result<T, E>:

use std::fs::File;

fn open_file(filename: &str) -> Result<File, std::io::Error> {
    let f = File::open(filename);
    
    match f {
        Ok(file) => Ok(file),
        Err(e) => Err(e),
    }
}

fn main() {
    match open_file("hello.txt") {
        Ok(_file) => println!("Bestand succesvol geopend."),
        Err(_e) => println!("Mislukt om bestand te openen."),
    }
}

Output kan “Bestand succesvol geopend.” of “Mislukt om bestand te openen.” zijn, afhankelijk van je hello.txt.

Voor onherstelbare fouten gebruiken we panic!:

fn main() {
    // Dit zal het programma doen panikeren omdat het bestand waarschijnlijk niet bestaat.
    let _f = File::open("nergens.txt").unwrap();
}

Voer het uit, en je ziet een paniekbericht. Je programma stopt direct.

Diepgaand

Historisch gezien is foutafhandeling in programmering een rommeltje geweest. Rust krijgt het juist met een duidelijk onderscheid tussen herstelbare en onherstelbare fouten.

De Result enum is voor herstelbare fouten. Het is expliciet - je handelt de Ok of Err variant af. Je hebt methoden zoals unwrap() en expect() ook, maar dat zijn snelle en vuile snelkoppelingen die kunnen leiden tot een panic!.

panic! is Rust’s manier om te schreeuwen dat er iets heel ergs gebeurd is, en het kan niet. Het is als een onherstelbare fout die uitvoering onmiddellijk stopt. Een paniek in Rust wordt vaak gevoeld met bugs die je niet verwacht te moeten afhandelen, zoals indexeren buiten de grenzen van een array.

Foutafhandeling door het teruggeven van Result wordt voorkeur gegeven wanneer je verwacht fouten te moeten afhandelen. Het is idiomatic Rust, wat betekent dat het de manier is waarop Rust-ontwikkelaars overeengekomen zijn om dingen te doen. Er is ook Option<T>, voor gevallen waarin een fout gewoon iets is dat None is in plaats van Some(T). Het gaat allemaal over het verwachten van het onverwachte zonder angst.

Alternatieven? Zeker, je zou andere foutafhandelingscrates kunnen gebruiken voor meer functies of ergonomisch gebruik. Zoals anyhow voor eenvoudige foutafhandeling, of thiserror voor fouten in bibliotheekcode.

Zie Ook

Geïnteresseerd in dieper duiken? Hier is waar te gaan:

Onthoud, goede foutafhandeling is niet alleen coderen; het is zorgen voor de gebruikers van je code. Gelukkig coderen!