capypad
0 Tage Serie
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
rust
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