La gestion des erreurs en Rust diffère de langages comme Java - il n'y a pas de try...catch
. L'approche habituelle consiste à définir un type d'erreur global au niveau applicatif :
Ici, nous utilisons la crate thiserror
qui facilite la définition de types d'erreur personnalisés et simplifie le code. Pour plus de concision, nous définissons également un AppResult
.
Dans l'écosystème Rust, deux crates sont couramment utilisées pour la gestion des erreurs :
thiserror : Destiné aux développeurs de bibliothèques pour définir des types d'erreur clairs. Il implémente automatiquement le trait std::error::Error
via une macro derive, tout en permettant de personnaliser l'affichage des erreurs. C'est le choix idéal pour les bibliothèques ou quand des types d'erreur explicites sont nécessaires.
anyhow : Destiné aux applications, fournissant un type d'erreur générique anyhow::Error
pouvant englober toute erreur implémentant std::error::Error
. Il se concentre sur la propagation plutôt que la définition des erreurs, réduisant le code passe-partout.
Dans certains cas, les deux crates peuvent être combinées : thiserror
pour définir les erreurs dans les bibliothèques, et anyhow
pour les traiter dans l'application.
Dans Salvo, les Handler
rencontrent fréquemment divers types d'erreurs (connexion DB, accès fichiers, réseau etc.). Ces erreurs peuvent être gérées comme précédemment :
Ici, home
retourne directement un AppResult<()>
. Mais comment afficher cette erreur ? Nous devons implémenter le trait Writer
pour notre type d'erreur personnalisé :
Les Handler
de Salvo peuvent retourner un Result
à condition que les types Ok
et Err
implémentent le trait Writer
.
Étant donné la popularité d'anyhow, Salvo fournit un support natif pour anyhow::Error
. Lorsque la fonctionnalité anyhow
est activée, anyhow::Error
implémente Writer
et est mappé sur InternalServerError
:
Pour l'utiliser, activez la fonctionnalité dans Cargo.toml :
Vos handlers peuvent alors retourner directement anyhow::Result<T>
:
Les erreurs contiennent souvent des informations sensibles qu'on ne souhaite pas exposer aux utilisateurs normaux. Mais pour les développeurs ou administrateurs, un accès détaillé peut être utile. Grâce aux paramètres de write()
, nous pouvons implémenter ce comportement :
Les pages d'erreur intégrées à Salvo conviennent à la plupart des cas, s'adaptant automatiquement au format (HTML, JSON, XML). Cependant, il est parfois nécessaire de les personnaliser.
Ceci peut être réalisé en implémentant un Catcher
personnalisé. Voir la section Catcher
pour plus de détails.