anyhow
Flexibla applikationsfel
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 meddelandenanyhow!,bail!ochensure!skapar fel- Bäst lämpat för applikationskod (binärkod)
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.