Lär dig programmera i Rust · Lektion

anyhow

Flexibla applikationsfel

Lektion 3 av 413 steg

anyhow är en gratis lektion i Lär dig programmera i Rust på CoddyKit. Detta är lektion 3 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.

Flexibla applikationsfel

I applikationskod vill ni ofta bara skicka fel vidare med relevant sammanhang, utan att definiera en typad enum för varje fel. Crate-paketet anyhow tillhandahåller en enkel feltyp för just detta.

Lägga till anyhow

Lägg till det som ett beroende. Det fungerar bra tillsammans med thiserror: thiserror för bibliotek och anyhow för binärer.

[dependencies]
anyhow = "1.0"

Aliaset anyhow::Result

anyhow::Result<T> är en förkortning för Result<T, anyhow::Error>. Typen Error kan innehålla valfritt fel som implementerar std::error::Error.

use anyhow::Result;

fn load() -> Result<String> {
    let text = std::fs::read_to_string("config.txt")?;
    Ok(text)
}

Automatisk konvertering

Operatorn ? konverterar automatiskt alla standardfel till anyhow::Error, så att ni fritt kan blanda feltyper.

use anyhow::Result;

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

Lägga till sammanhang

Metoden .context() lägger till ett lättbegripligt meddelande i ett fel och bygger en läsbar kedja när något går fel.

use anyhow::{Context, Result};

fn read_config(path: &str) -> Result<String> {
    let text = std::fs::read_to_string(path)
        .context("failed to read config file")?;
    Ok(text)
}

Lata sammanhang

Använd with_context när det är kostsamt att bygga meddelandet eller när det behöver data från körningen; closure-funktionen körs bara vid fel.

use anyhow::{Context, Result};

fn open(path: &str) -> Result<String> {
    std::fs::read_to_string(path)
        .with_context(|| format!("could not open {path}"))
}

Skapa ad hoc-fel

Makrot anyhow! skapar ett fel från ett meddelande, och bail! returnerar direkt med ett sådant fel.

use anyhow::{anyhow, bail, Result};

fn check(age: i32) -> Result<()> {
    if age < 0 {
        bail!("age cannot be negative");
    }
    if age > 150 {
        return Err(anyhow!("age {age} is implausible"));
    }
    Ok(())
}

Använda ensure!

ensure! fungerar som assert!, men returnerar ett fel i stället för att utlösa panik.

use anyhow::{ensure, Result};

fn divide(a: i32, b: i32) -> Result<i32> {
    ensure!(b != 0, "division by zero");
    Ok(a / b)
}

anyhow i main

Returnera anyhow::Result<()> från main för att få snyggt formaterade felkedjor utskrivna när ett fel inträffar.

use anyhow::Result;

fn main() -> Result<()> {
    let text = std::fs::read_to_string("data.txt")?;
    println!("{text}");
    Ok(())
}

Granska orsaken

Även om anyhow::Error är ogenomskinlig kan ni fortfarande granska den. downcast_ref återställer en konkret feltyp när ni behöver förgrena logiken utifrån den.

use anyhow::Result;

fn report(err: anyhow::Error) {
    if let Some(io) = err.downcast_ref::<std::io::Error>() {
        println!("io error: {io}");
    } else {
        println!("other error: {err}");
    }
}

thiserror jämfört med anyhow

En tumregel:

  • thiserror — bibliotek och typade fel som anroparna matchar mot
  • anyhow — applikationer där fel bara skickas vidare med sammanhang

Ni kan sömlöst konvertera ett thiserror-fel till anyhow med ?.

Snabb kontroll

Vilken anyhow-metod lägger till ett beskrivande meddelande i ett fel när det skickas vidare?

Sammanfattning

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

  • anyhow::Result<T> använder en flexibel feltyp
  • ? konverterar automatiskt alla standardfel
  • .context() / with_context() lägger till läsbara meddelanden
  • anyhow!, bail! och ensure! skapar fel
  • Bäst lämpat för applikationskod (binärkod)
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 ”anyhow” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lär dig programmera i Rust, inklusive ”anyhow”, 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 ”anyhow”?

Flexibla applikationsfel 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 3 av 4.

Hur lång tid tar lektionen ”anyhow”?

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