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.