capypad
0 Tage Serie
rust / beginner
Snippet

Der ? Operator für Fehlerfortpflanzung

Der ? Operator ist syntaktischer Zucker für die Fehlerbehandlung. Bei Verwendung auf einem Result entpackt er den Ok-Wert, wenn erfolgreich, oder gibt sofort den Err-Wert aus der aktuellen Funktion zurück, wenn ein Fehler aufgetreten ist. Dies eliminiert verbosity match-Ketten und lässt die Fehlerfortpflanzung wie einen natürlichen Teil des Berechnungsflusses erscheinen. Der ? Operator funktioniert nur in Funktionen, die Result oder Option zurückgeben.

snippet.rs
rust
1
use std::num::ParseIntError;\n\nfn parse_and_double(s: &str) -> Result<i32, ParseIntError> {\n let num: i32 = s.parse::<i32>()?;\n Ok(num * 2)\n}\n\nfn parse_and_add(s: &str, t: &str) -> Result<i32, ParseIntError> {\n let a = s.parse::<i32>()?;\n let b = t.parse::<i32>()?;\n Ok(a + b)\n}\n\nfn main() {\n match parse_and_double("42") {\n Ok(result) => println!("Doubled: {}", result),\n Err(e) => println!("Error: {}", e),\n }\n}
Erklärung
1
s.parse::<i32>()?
Versucht den String in i32 zu parsen; ? gibt Fehler zurück, wenn parsen fehlschlägt
2
Ok(num * 2)
Verpackt die erfolgreiche Berechnung in Ok, um den Rückgabetyp zu erfüllen
3
fn parse_and_add
Verkettet mehrere ? Operatoren — erster Fehler stoppt Ausführung und gibt zurück
4
Result<i32, ParseIntError>
Funktionssignatur deklariert den möglichen Fehlertyp für den Compiler
5
match parse_and_double("42")
Demonstriert den Aufruf der Funktion und das manuelle Behandeln des Result