0 Tage Serie
rust / expert
Snippet

Entwurf einer benutzerdefinierten Fehlerhierarchie mit Source-Verkettung

Um robuste Bibliotheken in Rust zu erstellen, sollten Sie benutzerdefinierte Fehler entwerfen, die std::error::Error implementieren. Durch das Überschreiben der source-Methode legen Sie die zugrunde liegende Ursache (den Quellfehler) Ihres Wrapper-Fehlers offen, sodass Aufrufer die gesamte Fehlerkette mithilfe von Standard-Diagnosewerkzeugen durchlaufen können.

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
use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub enum DatabaseError {
QueryFailed(String),
ConnectionLost,
}
impl fmt::Display for DatabaseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::QueryFailed(q) => write!(f, "Database query failed: {}", q),
Self::ConnectionLost => write!(f, "Database connection lost"),
}
}
}
impl Error for DatabaseError {}
#[derive(Debug)]
pub struct ApplicationError {
context: String,
source: DatabaseError,
}
impl fmt::Display for ApplicationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Application error occurred: {}", self.context)
}
}
impl Error for ApplicationError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
Some(&self.source)
}
}
Erklärung
1
impl Error for DatabaseError {}
Implementiert den Error-Trait mit Standardverhalten, da er keine zugrunde liegende Ursache hat.
2
source: DatabaseError,
Speichert den Fehler auf niedrigerer Ebene im Struct des Fehlers auf Anwendungsebene.
3
fn source(&self) -> Option<&(dyn Error + 'static)> {
Überschreibt source, um eine Referenz auf den verschachtelten Fehler zurückzugeben, der in ein Trait-Objekt verpackt ist.