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