Pouvez-vous recommander un modèle / une approche de conception pour exposer / tolérer / récupérer des erreurs système, la gestion des exceptions (Java, C ++, Perl, PHP)?
Certaines erreurs doivent être signalées.
Certaines erreurs peuvent être traitées en interne (par une nouvelle tentative ou sont sans conséquence (peuvent être ignorées).
Comment structurez-vous le code pour les capturer?
Mais toutes les erreurs doivent être enregistrées.
Quelles sont les meilleures pratiques?
Et pour les simuler afin de pouvoir tester pleinement les composants qui sont impactés par eux?
Question générale non spécifique au langage de programmation applicable à plusieurs langages de programmation modernes, mais accueillant des exemples d'illustration de modèles, d'approches et de philosophies en Java, C ++, PHP et Perl.
(Également demandé dans stackoverflow: /programming/7432596/recommend-a-design-pattern-approach-to-exposing-tolerating-recovering-from-system mais j'ai pensé que cela devrait aussi être demandé aux programmeurs car Je pense que les questions et réponses des programmeurs couvrent des problèmes de programmation / logiciels plus larges alors que stackoverflow concerne davantage la mise en œuvre technique à mon humble avis).
la source
Réponses:
Échouer rapidement est une excellente approche de conception, et peut-être peut-il être considéré comme un modèle: http://en.wikipedia.org/wiki/Fail-fast
J'ai également trouvé un certain nombre de principes utiles:
la source
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:
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.
la source
Construisez vos objets de la bonne façon, ne vous inquiétez pas des facteurs externes. Si vous choisissez de profiter des exceptions, faites en sorte que vos objets lèvent des exceptions s'ils échouent à quelque chose.
Une fois que tous vos objets fonctionnent correctement, il devrait être assez facile de créer une hiérarchie de responsabilité de gestion des erreurs propre dans votre conception.
la source