Pour lever des exceptions, j'utilise généralement des classes d'exceptions intégrées, par exemple ArgumentNullException
et NotSupportedException
. Cependant, parfois j'ai besoin d'utiliser une exception personnalisée et dans ce cas j'écris:
class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }
etc. Ensuite, je lance et attrape ces derniers dans mon code. Mais aujourd'hui, je suis tombé sur la ApplicationException
classe - devrais-je utiliser cela à la place? C'est pour quoi?
Il semble inefficace d'avoir beaucoup de classes d'exception effectivement identiques avec des noms différents (je n'ai généralement pas besoin de fonctionnalité individuelle). Mais je n'aime pas l'idée d'attraper un générique ApplicationException
et d'avoir à utiliser du code supplémentaire pour déterminer quelle était l'erreur.
Où doit ApplicationException
s'inscrire mon code?
Réponses:
Selon les remarques dans msdn:
Tirez-les de
Exception
. De plus, je ne vois pas de problème avec la création de nouvelles exceptions pour vos cas, tant que cela est justifié. Si vous rencontrez un cas où il y a déjà une exception dans le framework, utilisez-la, sinon, lancez la vôtre.la source
ApplicationException
soit inutile et existe-t-il simplement à cause de la compatibilité ascendante?La réponse courte est: nulle part.
C'est une relique du passé, où Microsoft voulait que les développeurs héritent de toutes leurs exceptions personnalisées d'ApplicationException. Peu de temps après, ils ont changé d'avis et ont indiqué que les exceptions personnalisées devraient dériver de la classe Exception de base. Consultez Meilleures pratiques pour gérer les exceptions sur MSDN.
L'une des raisons les plus largement diffusées à cet égard provient d'un extrait de Jeffery Richter dans Framework Design Guidelines :
Alors là vous l'avez. Le résumé analytique est qu'ApplicationException n'est pas nuisible , juste inutile .
la source
Whizbang
décide qu'elle veut avoir toutes ses exceptions sous une hiérarchie commune, utiliserApplicationException
à cette fin n'offrirait vraiment aucun avantage par rapport à l'utilisation d'uneWhizbangException
classe de base personnalisée . Le problème le plus grave dans la hiérarchie des exceptions de .net n'est pasApplicationException
, cependant, mais avec l'échec de la séparation des exceptions en catégories probablement fatales pour l'application, probablement fatales pour les threads et liées aux problèmes locaux, ainsi que l'incapacité d'avoir exceptions «composites» significatives.finally
blocage alors qu'une autre exception est en attente, lescatch
blocs plus haut dans la pile d'appels doivent être déclenchés s'ils correspondent à une exception imbriquée, mais laissez les autres exceptions en attente afin que la sortie uncatch
bloc passerait à un autrecatch
bloc dans le mêmetry
bloc (le cas échéant), et quitter unfinally
bloc avec toutes les exceptions en attente sauterait au prochain bloccatch
oufinally
.Dans la conception initiale, dans .NET 1.0, il était prévu que le framework lui-même soit lancé
SystemException
et dérivé; tandis que les applications utilisateur - jetteraApplicationException
et dérivé.Mais plus tard, dans .NET 2.0, cela a été abandonné.
Ainsi dérivent de
Exception
.la source