Gestion des erreurs
Approches courantes de gestion des erreurs dans les applications Rust
La gestion des erreurs en Rust diffère des langages comme Java ; elle ne dispose pas de constructions telles que try...catch. L'approche typique consiste à définir un type d'erreur global au niveau de l'application :
Ici, la bibliothèque thiserror est utilisée, ce qui facilite la définition de types d'erreur personnalisés et simplifie le code. Par souci de concision, un alias de type AppResult est également défini.
thiserror vs. anyhow
Dans l'écosystème de gestion des erreurs de Rust, deux bibliothèques couramment utilisées sont thiserror et anyhow :
-
thiserror : Convient aux développeurs de bibliothèques pour définir des types d'erreur clairs. Elle utilise des macros derive pour aider à implémenter le trait
std::error::Errorpour les types d'erreur personnalisés tout en permettant de définir les représentations d'erreur. Lors de la construction d'une bibliothèque ou de la fourniture de types d'erreur clairs aux utilisateurs,thiserrorest le meilleur choix. -
anyhow : Destinée aux développeurs d'applications, elle fournit un type d'erreur générique
anyhow::Errorqui peut encapsuler toute erreur implémentant le traitstd::error::Error. Elle se concentre davantage sur la propagation des erreurs que sur leur définition, ce qui la rend particulièrement adaptée au code de la couche application. Vous pouvez rapidement convertir diverses erreurs enanyhow::Error, réduisant ainsi le besoin de code passe-partout.
Dans certains scénarios, vous pourriez utiliser les deux bibliothèques : définir les types d'erreur avec thiserror dans les bibliothèques et gérer et propager ces erreurs avec anyhow dans les applications.
Gestion des erreurs dans les gestionnaires
Dans Salvo, les Handler rencontrent souvent diverses erreurs, telles que des erreurs de connexion à la base de données, des erreurs d'accès aux fichiers, des erreurs de connexion réseau, etc. Pour ces types d'erreurs, l'approche de gestion des erreurs mentionnée précédemment peut être appliquée :
Ici, home retourne directement un AppResult<()>. Mais comment cette erreur doit-elle être affichée ? Nous devons implémenter le trait Writer pour le type d'erreur personnalisé AppResult, où nous pouvons décider comment afficher l'erreur :
Dans Salvo, un Handler peut retourner un Result, à condition que les types Ok et Err dans le Result implémentent tous deux le trait Writer.
Gestion des erreurs avec anyhow
Étant donné l'utilisation répandue d'anyhow, Salvo fournit une prise en charge intégrée pour anyhow::Error. Lorsque la fonctionnalité anyhow est activée, anyhow::Error implémente le trait Writer et est mappé sur InternalServerError :
Pour utiliser la fonctionnalité anyhow, activez la fonctionnalité anyhow de Salvo dans Cargo.toml :
Cela permet à vos fonctions gestionnaires de retourner directement anyhow::Result<T> :
Les erreurs contiennent souvent des informations sensibles, qui ne devraient généralement pas être visibles par les utilisateurs ordinaires pour des raisons de sécurité et de confidentialité. Cependant, si vous êtes un développeur ou un administrateur de site, vous pourriez préférer que les erreurs soient entièrement exposées, révélant ainsi les informations d'erreur les plus précises.
Comme illustré, dans la méthode write, nous pouvons accéder aux références de Request et Depot, ce qui facilite la mise en œuvre de l'approche ci-dessus :
Affichage des pages d'erreur
Les pages d'erreur intégrées de Salvo répondent aux exigences dans la plupart des cas, affichant des pages Html, Json ou Xml en fonction du type de données de la requête. Cependant, il existe des situations où des affichages de pages d'erreur personnalisés sont toujours souhaités.
Cela peut être réalisé en implémentant un Catcher personnalisé. Pour des instructions détaillées, reportez-vous à la section Catcher.