Lär dig programmera i Rust · Lektion

thiserror

Egna feltyper

Lektion 2 av 413 steg

thiserror är en gratis lektion i Lär dig programmera i Rust på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lär dig programmera i Rust, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lär dig programmera i Rust innehåller totalt 4 lektioner.

Varför anpassade fel?

Bibliotek bör tillhandahålla meningsfulla feltyper så att anroparna kan reagera på specifika fel. Om ni skriver dessa för hand blir det mycket upprepande kod. Crate-paketet thiserror genererar den åt er.

Lägga till thiserror

Lägg till det som ett beroende. Det är ett crate-paket med derive-makron och ingen körtidskostnad.

[dependencies]
thiserror = "1.0"

Definiera en feluppräkning

Använd derive för Error på en enum där varje variant representerar ett separat fel. Attributet #[error("...")] tillhandahåller Display-meddelandet.

use thiserror::Error;

#[derive(Error, Debug)]
pub enum DataError {
    #[error("item not found")]
    NotFound,
    #[error("invalid input: {0}")]
    Invalid(String),
}

Interpolera fält

Meddelandesträngen kan referera till namngivna eller positionsbaserade fält, så feltexten innehåller relevant sammanhang.

use thiserror::Error;

#[derive(Error, Debug)]
pub enum ConfigError {
    #[error("missing key: {key}")]
    Missing { key: String },
    #[error("value {0} out of range")]
    OutOfRange(i32),
}

Automatisk Display och Error

Derive implementerar automatiskt både Display (utifrån era meddelanden) och std::error::Error. Inga manuella impl-block behövs.

Omsluta ett källfel

#[from] genererar en From-implementation så att operatorn ? kan konvertera ett underliggande fel till er typ. #[source] markerar orsaken.

use thiserror::Error;

#[derive(Error, Debug)]
pub enum AppError {
    #[error("io failure")]
    Io(#[from] std::io::Error),
    #[error("parse failure")]
    Parse(#[from] std::num::ParseIntError),
}

Använda det med ?

Tack vare #[from] konverterar operatorn ? automatiskt standardfel till AppError.

fn read_number(path: &str) -> Result<i32, AppError> {
    let text = std::fs::read_to_string(path)?; // io::Error -> AppError
    let n: i32 = text.trim().parse()?;          // ParseIntError -> AppError
    Ok(n)
}

Källkedjan

När ni omsluter ett fel exponerar thiserror orsaken via Error::source, vilket möjliggör fullständiga felkedjor för loggning och felsökning.

transparenta fel

#[error(transparent)] vidarebefordrar både Display och källan till det omslutna felet, vilket är användbart för en variant som bara skickar felet vidare.

use thiserror::Error;

#[derive(Error, Debug)]
pub enum WrapError {
    #[error(transparent)]
    Other(#[from] std::io::Error),
}

När ska thiserror användas?

Använd thiserror när:

  • Ni skriver ett bibliotek
  • Anroparna behöver matcha mot specifika felvarianter
  • Ni vill ha ett stabilt, typat fel-API

För applikationer där ni bara vill skicka fel vidare är anyhow ofta enklare.

Matcha mot varianter

Eftersom felet är en riktig enum kan anroparna använda match för att reagera olika på varje typ av fel.

fn handle(err: AppError) {
    match err {
        AppError::Io(_) => println!("retry the file operation"),
        AppError::Parse(_) => println!("ask the user to fix input"),
    }
}

Snabb kontroll

Vad genererar attributet #[from] i en thiserror-enum?

Sammanfattning

Ni har lärt er om crate-paketet thiserror:

  • #[derive(Error)] genererar Display- och Error-implementationer
  • #[error("...")] definierar meddelanden med fältinterpolation
  • #[from] möjliggör ?-konvertering från källfel
  • transparent vidarebefordrar till ett omslutet fel
  • Idealiskt för typade fel-API:er i bibliotek
Gratis att börja

Lär dig Rust med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
39
Lektioner
144

Vanliga frågor

Är lektionen ”thiserror” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lär dig programmera i Rust, inklusive ”thiserror”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lär dig programmera i Rust innehåller totalt 4 lektioner.

Vad lär jag mig i ”thiserror”?

Egna feltyper Ni övar på Lär dig programmera i Rust med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Lär dig programmera i Rust?

Du behöver inga förkunskaper. Utbildningen i Lär dig programmera i Rust på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”thiserror”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Lär dig programmera i Rust-lektionen?

Ja. Varje Lär dig programmera i Rust-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Result och ?-operatorn
  2. thiserror
  3. anyhow
  4. Felkonvertering
← Tillbaka till Lär dig programmera i Rust