rust / intermediate
Snippet
Benutzerdefinierte Fehlertypen mit Display und std::error::Error
Benutzerdefinierte Fehlertypen kapseln domänenspezifische Fehlerfälle. Durch die Implementierung von Display werden Fehler menschenlesbar. Das Error-Trait ermöglicht Komponierbarkeit mit Rusts ?-Operator und Fehlerfortpflanzungsketten. Dieser Ansatz bietet strukturierte Fehlerbehandlung über einfache Result-Typen hinaus.
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::error::Error;#[derive(Debug)]enum DataStoreError {NotFound(String),PermissionDenied { resource: String, user: String },ConnectionFailed(String),}impl fmt::Display for DataStoreError {fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {match self {DataStoreError::NotFound(key) => write!(f, "Item '{}' not found", key),DataStoreError::PermissionDenied { resource, user } => {write!(f, "User '{}' cannot access '{}'", user, resource)},DataStoreError::ConnectionFailed(msg) => write!(f, "Connection failed: {}", msg),}}}impl Error for DataStoreError {}fn lookup_user(user_id: &str) -> Result<String, DataStoreError> {if user_id.is_empty() {return Err(DataStoreError::NotFound("empty user id".to_string()));}if user_id == "forbidden" {return Err(DataStoreError::PermissionDenied {resource: "user database".to_string(),user: user_id.to_string(),});}Ok(format!("User #{}", user_id))}fn main() {match lookup_user("forbidden") {Ok(name) => println!("Found: {}", name),Err(e) => eprintln!("Error: {}", e),}}
Erklärung
1
enum DataStoreError {
Varianten erfassen verschiedene Fehlerszenarien mit kontextreichen Daten
2
PermissionDenied { resource: String, user: String }
Strukturähnliche Variante trägt mehrere kontextuelle Felder
3
impl fmt::Display for DataStoreError {
Display-Implementierung ermöglicht menschenlesbare Fehlermeldungen
4
impl Error for DataStoreError {}
Error-Trait ermöglicht ?-Operator und Fehlerketten im aufrufenden Code
5
Result<String, DataStoreError>
Funktion gibt typisierte Fehler zurück, die der Aufrufer angemessen behandeln kann