Duplicaté possible: strong>
meilleures pratiques pour la gestion des exceptions en Java ou C # < / p>J'ai lu Une question plus tôt aujourd'hui sur Stackoverflow et cela m'a fait penser à propos de quelle est la meilleure pratique pour la manipulation des exceptions. P>
Donc, ma question est
Quelle est la meilleure pratique forte> à gérer des exceptions à Code propre et de haute qualité forte >. P> Voici mon code, je pense que c'est calme tout de suite, mais s'il vous plaît laissez-moi savoir si je me trompe ou pas clair! J'ai essayé de garder à l'esprit le testabilité et le même niveau d'abstraction dans les méthodes. P>
Chaque commentaire constructif est accueilli. :) p>
xxx pré> édité: strong> p>
Ce que je veux éviter, c'est écrire beaucoup d'étuis de capture après l'autre ... P> blockQuote>
4 Réponses :
Pour des exceptions vérifiées que je ne vais pas déranger, j'utilise toujours org.apache.commons.lang.unhandleXception.
Par exemple P>
/** * Calls Thread.sleep(millis) */ public static void threadSleep(final long millis) { try { Thread.sleep(millis); } catch (final InterruptedException e) { throw new UnhandledException(e); } }
Quelques suggestions à première vue:
jetable code> et plutôt attraper comme spécifique em> d'une exception que possible. Le problème avec l'attrape jetable code> est celui-ci inclura des classes code> comme code> comme OutofMemoryError Code> Et similaire. Vous voulez laisser ces traverser (ils sont décochés pour une raison). Li>
- Lorsque vous enregistrez des exceptions toujours em> passez l'exception et pas seulement son
Tostring () code>. Il est très difficile de diagnostiquer des problèmes sans la trace de la pile. LI>
- Vous ne voulez probablement pas de méthode de manutention générale d'exception. Li>
OL>
Ainsi, dans des endroits où vous attrapez des exceptions, vous voulez quelque chose comme ceci: p> xxx pré> Le message doit inclure des informations contextuelles si possible. Tout ce qui pourrait aider à suivre le problème lorsque quelqu'un cherche à travers des grumes. P> P>
Je voulais créer une méthode de manutention d'exception générale. Pourriez-vous m'expliquer pourquoi est-ce une mauvaise pratique? Je veux dire que je peux voir que de cette façon, je peux avaler des exceptions qui ne devraient pas l'être, mais jusqu'à présent, je ne connaissais pas de meilleur moyen de garder la logique commerciale propre. Donc, ce que je n'ai pas voulu voir, c'est d'attraper des cas après l'autre ...
Si vous avez un bloc de code commun que vous souhaitez réutiliser à quelques exceptions près, une méthode générale irait bien. Vous n'avez qu'une ligne dans cette méthode pour le moment cependant, ce n'est donc pas moins de code à la place qui fait l'appel. Si vous conservez, vous devez au moins ajouter une variable de méthode pour réussir le message correspondant. Je ne pense pas que ce soit malpropre d'avoir une journalisation spécifique et une manipulation d'exception spécifique dans votre logique d'entreprise. Si vous vous trouvez en train de répéter le même bloc de code, je l'abstrais (en règle générale).
attrape toujours l'exception la plus spécifique possible - sinon jamais attraper jadis. p>
La chose la plus importante pour moi est que vous n'ayez jamais de bloc de capture vide - l'un d'entre eux peut prendre une quantité de temps incroyable pour trouver si quelque chose à l'intérieur de l'essai jette une exception. P>
J'aime personnellement supprimer les exceptions vérifiées le plus rapidement possible et les remplacer par des vérifications pré / poster des conditions si possible. Même avec des exceptions décochées à une moindre mesure - toutefois, des exceptions non cochées sont en fait un moyen assez difficile d'indiquer une erreur de programmation comme le contrôle du paramètre pour assurer l'état de l'objet (bien que des affirmations puissent être mieux encore) P>
+1 pour ne jamais avoir des blocs de capture vides - et courez PMD / FindBugs pour le chercher
Et si votre enregistreur se jette pendant que vous enregistrez une exception?
Espérons que c'est assez intelligent de signaler que c'est une exception à StDerr avec votre exception enveloppée comme la cause au moins que vous avez quelque chose.
Il y a quelques options que vous pouvez choisir. p>
L'un des adnvantages les plus importants des exceptions utilisant est que vous pouvez avoir le seul gestionnaire d'exception pour tous les cas. Lorsque vous écrivez votre code, vous devriez penser à la fonctionnalité d'abord et que sur la manipulation des exceptions. En conséquence, vous pouvez sauter dans certains endroits essayer / attraper du tout pour des exceptions non cochées et déclarer vos méthodes comme Si vous ne savez pas ce que faire exactement avec une exception, retirez-le. P> li>
jette SometheckeException code> pour des exceptions vérifiées. Cela vous permet d'avoir le nombre minimum de gestionnaires d'exception. P> li>
@XScape: Je vais certainement le lire, merci.
À titre de note latérale, je vous recommanderais de marquer vos méthodes d'aide privées
statique code>, comme c'est ce qu'elles sont: elles prennent des intrants et produisent des sorties uniquement sur la base de ces intrants. Quand je n'ai vu aucun
statique code> de votre déclaration de méthode, j'ai été obligé de vérifier si les méthodes n'utilisaient vraiment aucun état, ce qui est mauvais, car le code me force à se concentrer sur quelque chose qui n'est pas important du tout. pour le lire. Cette question concerne que: Stackoverflow. com / questions / 3346764 / ...
@Bruno Reis: Merci, je vais le lire.