rust / intermediate
Snippet
Benutzerdefinierte Fehlertypen mit dem ? Operator
Benutzerdefinierte Fehlertypen ermöglichen präzises Fehlerhandling mit dem ? Operator durch das From-Trait. Durch die Implementierung von From<ParseIntError> für unseren DataError-Enum konvertiert der ? Operator Parsefehler automatisch. Jede Enum-Variante repräsentiert eine eindeutige Fehlerkategorie, was Aufrufern erlaubt, spezifische Fehler zu behandeln oder das Display-Trait für benutzerfreundliche Nachrichten zu nutzen. Dieses Muster lässt sich natürlich mit anderen Funktionen kombinieren, die Result zurückgeben.
snippet.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use std::fmt;use std::num::ParseIntError;#[derive(Debug)]enum DataError {ParseError(ParseIntError),OutOfRange(i32),EmptyInput,}impl fmt::Display for DataError {fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {match self {DataError::ParseError(e) => write!(f, "Parse error: {}", e),DataError::OutOfRange(n) => write!(f, "Value {} out of range (0-100)", n),DataError::EmptyInput => write!(f, "Input cannot be empty"),}}}impl From<ParseIntError> for DataError {fn from(err: ParseIntError) -> Self {DataError::ParseError(err)}}fn parse_and_validate(s: &str) -> Result<u32, DataError> {if s.is_empty() {return Err(DataError::EmptyInput);}let num: i32 = s.parse()?;if !(0..=100).contains(&num) {return Err(DataError::OutOfRange(num));}Ok(num as u32)}fn main() {match parse_and_validate("42") {Ok(n) => println!("Valid number: {}", n),Err(e) => println!("Error: {}", e),}}
Erklärung
1
impl From<ParseIntError> for DataError
Implementierung von From ermöglicht automatische ? Konvertierung zwischen Fehlertypen
2
let num: i32 = s.parse()?;
? Operator ruft Into::into() auf, um ParseIntError in DataError zu konvertieren
3
if !(0..=100).contains(&num)
Bereichsprüfung stellt sicher, dass Wert innerhalb gültiger Grenzen liegt
4
Ok(num as u32)
Cast zum Zieltyp nach Validierung; sicher da Bereich geprüft