Question

Dois-je toujours envelopper les appels de ressources externes dans un try-catch? (ex. appels à une base de données ou à un système de fichiers) Existe-t-il une bonne pratique pour le traitement des erreurs lors de l’appel de ressources externes?

Était-ce utile?

La solution

Saisissez uniquement les exceptions que vous pouvez gérer . Ainsi, par exemple, lorsque vous utilisez des ressources externes, la meilleure pratique consiste à intercepter des exceptions spécifiques que vous savez pouvoir gérer. Dans le cas de fichiers, cela peut être (IOException, SecurityException, etc.), dans le cas de Database, l'exception peut être SqlException ou autre.

Dans tous les cas, ne capturez pas les exceptions que vous ne gérez pas , laissez-les passer au niveau supérieur qui le peut. Ou si, pour une raison quelconque, vous interceptez les exceptions mais ne les gérez pas, redistribuez-les simplement avec throw; (ce qui créera une opération IL redistribuée, par opposition à trow).

Si vous utilisez des ressources que vous ne connaissez pas le type d'exceptions pouvant être émises, vous êtes en quelque sorte contraint de saisir le type d'exception général. Et dans ce cas, la solution la plus sûre serait d’utiliser lesdites ressources d’un domaine d’application différent (si possible), ou de laisser l’exception remonter au niveau supérieur (ex-interface utilisateur) où elles pourront être affichées ou consignées.

Autres conseils

Je pense qu'il y a trois raisons d'avoir un bloc bloqueur:

  • Vous pouvez gérer l'exception et récupérer (à partir du "code de bas niveau")
  • Vous souhaitez reformuler l'exception (encore une fois, à partir du code "de bas niveau")
  • Vous êtes au sommet de la pile et, bien que vous ne puissiez pas récupérer l'opération elle-même, vous ne voulez pas que l'application tout entière tombe en panne

Si vous vous en tenez à cela, vous devriez avoir très peu de blocs catch comparés aux blocs try / finally - et ces blocs try / finally appellent presque toujours simplement Dispose , et il est donc préférable d'écrire à l'aide de .

Dernière ligne: il est très important d’avoir un bloc finally pour libérer des ressources, mais les blocs catch devraient généralement être plus rares.

Eric Lippert a un bon blog à ce sujet, ici .

Cela ne sert à rien (à l'exception de "rendre vexant" (voir le blog)) de capturer une exception à moins que vous ne puissiez faire quelque chose d'utile; et dans la plupart des cas, vous ne pouvez tout simplement pas - alors laissez-le bouillonner (votre interface utilisateur doit évidemment nettoyer et afficher quelque chose).

Cependant, vous pouvez avoir un "essai / enfin". traiter de la gestion des ressources. Ou même plus propre, un "en utilisant" bloquer pour faire la même chose.

Je pense que la réponse absolue est totalement conditionnelle (quel contrôle avez-vous sur l'environnement, quel est l'équilibre attendu entre performances et cohérence et bien d'autres encore, j'en suis sûr), mais en général je le fais toujours, en choisissant la sécurité la performance potentiellement plus lente.

Cela dépend toujours de ce que vous voulez réaliser. Un serveur qui ne répond pas peut être assez sérieux pour arrêter tout ce que la routine fait, et l'exception devrait être renvoyée à l'appelant.

Dans d'autres cas, le fait de ne pas avoir mis à jour la base de données vous importe peu. Alors consommer l'exception est OK.

Évidemment, vous ne voulez pas montrer la trace de la pile à votre utilisateur final, vous devez donc la récupérer quelque part.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top