Ayant travaillé avec des exceptions en Java et .NET ET après avoir lu beaucoup d'articles sur comment / quand / pourquoi intercepter des exceptions, j'ai finalement trouvé les étapes suivantes que je traverse dans ma tête chaque fois que je vois une exception potentielle se produire, ou un exception je dois attraper (Java) ... même si ça n'arrive jamais (soupir ...). Et cela semble fonctionner, au moins pour moi:
- Y a-t-il quelque chose d'utile que je peux faire avec cette exception (sauf la journalisation)? Si la réponse est oui, écrivez le code de la solution de contournement et si la solution de contournement peut lever des exceptions, passez à 2:
- Enveloppez l'exception autour d'une exception d'exécution, jetez-la, passez à 3.
- Dans la classe de niveau supérieur où une éventuelle transaction de base de données / processus a été lancée, interceptez l'exception, annulez la transaction, renvoyez l'exception.
- Au niveau supérieur (qui peut être celui où la transaction a été initiée), enregistrez l'exception à l'aide d'un cadre de journalisation tel que slf4j (couplé à log4j par exemple) ou log4net . Si possible, envoyez directement l'exception à une liste de distribution composée de développeurs de l'application.
- S'il existe une interface graphique, affichez un message d'erreur indiquant de la manière la plus conviviale la cause du problème; n'affiche pas l'exception / stacktrace, l'utilisateur s'en fiche et n'a pas besoin de savoir qu'il s'agissait d'une NullPointerException.
Je devrais également ajouter l' étape 0 , où je lève intentionnellement ce que j'appelle une exception "métier" (une nouvelle exception que je crée en étendant la classe "Exception") lorsqu'un traitement complexe ne peut pas être exécuté en raison d'erreurs de données, MAIS cela sont connus car ils ont été identifiés comme des cas d'exception au cours de l'analyse.
À l'exception de la partie enregistrement, je suis entièrement d'accord avec les points écrits par "mikera"; J'ajouterai simplement que l'exception doit être enregistrée une fois seule .
En outre, les étapes que j'ai répertoriées peuvent être différentes si ce que vous écrivez est une API / Framework . Là, le lancement d'exceptions bien conçues est obligatoire pour aider les développeurs à comprendre leurs erreurs.
En ce qui concerne le test des exceptions, en utilisant des objets fictifs, vous devriez pouvoir tester presque tout, qu'il soit exceptionnel ou non, à condition que vos classes respectent la meilleure pratique "une classe pour faire une chose". Je m'assure également personnellement de marquer les méthodes les plus importantes mais cachées comme "protégées" au lieu de "privées" afin de pouvoir les tester sans trop de tracas. En dehors de cela, tester les exceptions est simple, il suffit de provoquer l'exception et de "s'attendre" à ce qu'une exception se produise en l'attrapant. Si vous n'obtenez pas d'exception, vous avez une erreur de cas de test unitaire.