Teil 20: Option und Result
Lernziel: Fehler kontrolliert behandeln.
Voraussetzungen: Die vorherigen Lektionen, insbesondere Teil 19.
Worum geht es?
Rust bildet einen möglicherweise fehlenden Wert mit Option<T> und Erfolg oder Fehler mit Result<T, E> ab.
Schritt für Schritt
fn temperatur_lesen(text: &str) -> Result<f64, std::num::ParseFloatError> {
text.trim().parse::<f64>()
}
fn main() {
match temperatur_lesen("206.5") {
Ok(temperatur) => println!("{temperatur} °C"),
Err(fehler) => eprintln!("Fehler: {fehler}"),
}
}
Option
fn erster_wert(werte: &[f64]) -> Option<f64> {
werte.first().copied()
}
Das Ergebnis lautet entweder Some(wert) oder None.
Der Fragezeichen-Operator
? gibt einen Fehler an die aufrufende Funktion zurück, wenn eine Operation fehlschlägt:
fn lade_zahl(text: &str) -> Result<i32, std::num::ParseIntError> {
let zahl: i32 = text.parse()?;
Ok(zahl)
}
unwrap() und expect() sind beim Experimentieren nützlich, können bei Fehlern aber das Programm abbrechen. Bei echten Benutzereingaben sind match, ? und passende Fehlermeldungen vorzuziehen.
Selbst ausprobieren
Schreibe eine Funktion, die einen eingegebenen Text in u32 umwandelt und Fehler als Result zurückgibt.
Musterlösung anzeigen
fn lies_anzahl(text: &str) -> Result<u32, std::num::ParseIntError> {
text.trim().parse::<u32>()
}
fn main() {
match lies_anzahl("12") {
Ok(wert) => println!("{wert} Teile"),
Err(e) => eprintln!("Ungültig: {e}"),
}
}
Das solltest du mitnehmen
- Fehler kontrolliert behandeln.
- Nutze
cargo runfür das Ausführen undcargo checkfür eine schnelle Fehlerprüfung (ab Teil 4). - Experimentiere mit veränderten Werten und beobachte die Compilermeldungen.
