snafu bietet ein umfassenderes Framework für Fehlerbehandlung mit Fokus auf Fehlerkontext und -verketung.
Merkmale:
Fördert präzise Hinzufügung von Fehlerkontext durch "Context Selector"-Muster
Empfiehlt "Ein Fehlertyp pro Modul"-Ansatz
Unterstützt strukturierte und Tupel-Varianten für Fehler
Eingebaute Unterstützung für Backtraces
usesnafu::{Snafu,ResultExt,Backtrace};#[derive(Debug, Snafu)]pubenumError{#[snafu(display("Konfigurationsdatei {filename:?} konnte nicht gelesen werden"))]ReadConfig{ filename:String, source:std::io::Error, backtrace:Backtrace,},// Tupel-Variante#[snafu(display("IO-Fehler aufgetreten"))]Io(#[snafu(source)]std::io::Error,#[snafu(backtrace)]Backtrace),}// Beispiel für Context Selectorfnread_config(path:&str)->Result<Config,Error>{std::fs::read_to_string(path).context(ReadConfigSnafu{ filename: path })?;// ...}
anyhow ist ein anderer Ansatz zur Fehlerbehandlung, der sich auf Anwendungen statt Bibliotheken konzentriert.
Merkmale:
Entwickelt für Fehlerbehandlung in Anwendungen, nicht Bibliotheken
Bietet dynamischen anyhow::Error-Typ für beliebige Fehler
Vereinfacht den Umgang mit verschiedenen Fehlertypen
Keine Definition benutzerdefinierter Fehlertypen nötig
useanyhow::{Context,Result};fnmain()->Result<()>{let config =std::fs::read_to_string("config.json").context("Konfigurationsdatei konnte nicht gelesen werden")?;let app_config:AppConfig=serde_json::from_str(&config).context("Ungültiges Konfigurationsformat")?;// Result<T> als Alias für Result<T, anyhow::Error>Ok(())}
anyhow vs thiserror/snafu:
anyhow fokussiert auf schnelle Fehlerbehandlung in Anwendungen
thiserror/snafu fokussieren auf präzise Fehlertyp-Hierarchien
anyhow typisch für Anwendungscode
thiserror/snafu typisch für Bibliothekscode
In der Praxis werden anyhow und thiserror oft kombiniert: Bibliotheken definieren präzise Fehlertypen mit thiserror, während Anwendungen anyhow für die Fehlerbehandlung nutzen.