Imaginez que vous écrivez une classe de pile. Vous ne placez aucun code de gestion des exceptions dans la classe, car cela pourrait produire les exceptions suivantes.
- ArrayIndexError - déclenché lorsque l'utilisateur tente de sortir d'une pile vide
- NullPtrException - levée en raison d'un bogue dans l'implémentation provoquant une tentative de référence à une référence nulle
Une approche simpliste pour encapsuler les exceptions pourrait décider d'encapsuler ces deux exceptions dans une classe d'exception StackError. Cependant, cela manque vraiment le point d'envelopper les exceptions. Si un objet lève une exception de bas niveau, cela devrait signifier que l'objet est cassé. Cependant, il y a un cas où cela est acceptable: lorsque l'objet est en fait cassé.
Le point d'encapsuler les exceptions est que l'objet doit donner des exceptions appropriées pour les erreurs normales. La pile doit soulever StackEmpty et non ArrayIndexError lors de l'éclatement d'une pile vide. L'intention n'est pas d'éviter de lever d'autres exceptions si l'objet ou le code est cassé.
Ce que nous avons vraiment voulons éviter, c'est d'attraper des exceptions de bas niveau qui ont été passées à travers des objets de haut niveau. Une classe de pile qui lève une ArrayIndexError lors de l'éclatement d'une pile vide est un problème mineur. Si vous attrapez réellement cette ArrayIndexError, nous avons un problème sérieux. La propagation des erreurs de bas niveau est un péché beaucoup moins grave que de les attraper.
Pour ramener cela à votre exemple d'une SQLException: pourquoi obtenez-vous des SQLExceptions? L'une des raisons est que vous passez des requêtes non valides. Cependant, si votre couche d'accès aux données génère de mauvaises requêtes, elle est cassée. Il ne doit pas tenter de reconditionner sa rupture dans une exception DataAccessFailure.
Cependant, une exception SQLException peut également survenir en raison d'une perte de connexion à la base de données. Ma stratégie sur ce point consiste à intercepter l'exception à la dernière ligne de défense, à signaler à l'utilisateur que la connectivité à la base de données a été perdue et à l'arrêt. Étant donné que l'application a un accès à perte à la base de données, il n'y a vraiment pas beaucoup plus à faire.
Je ne sais pas à quoi ressemble votre code. Mais il semble que vous traduisiez aveuglément toutes les exceptions en exceptions de niveau supérieur. Vous ne devriez le faire que dans un nombre relativement restreint de cas. La plupart des exceptions de niveau inférieur indiquent des bogues dans votre code. Les attraper et les reconditionner est contre-productif.