Dois-je dériver des exceptions personnalisées de Exception ou ApplicationException dans .NET?

Quelle est la meilleure pratique lors de la création de vos classes d’exception dans une solution .NET: Pour dériver de System.Exception ou de System.ApplicationException ?

Selon Jeffery Richter dans le livre Framework Design Guidelines:

System.ApplicationException est une classe qui ne devrait pas faire partie du framework .NET.

Il était destiné à avoir un sens en ce sens que vous pourriez potentiellement intercepter “toutes” les exceptions d’application, mais le modèle n’a pas été suivi et n’a donc aucune valeur.

Vous devez dériver des exceptions personnalisées de System.Exception .

Même MSDN dit maintenant d’ignorer ApplicationException :

Si vous concevez une application devant créer ses propres exceptions, il est conseillé de dériver les exceptions personnalisées de la classe Exception. On pensait à l’origine que les exceptions personnalisées devaient dériver de la classe ApplicationException; toutefois, dans la pratique, cela n’a pas été trouvé comme apportant une valeur significative. Pour plus d’informations, voir Meilleures pratiques pour gérer les exceptions .

http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx

ApplicationException considérée comme inutile est un argument fort et critique contre ApplicationException .

Upshot: ne l’utilisez pas. Dériver d’ Exception .

Les auteurs du framework eux-mêmes considèrent ApplicationException comme étant sans valeur:

http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx

avec une belle suite ici:

http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx

En cas de doute, je suis leur livre Framework Design Guidelines.

http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756

Le sujet du blog est discuté plus loin.

rp

J’ai l’habitude de faire:

 private void buttonFoo_Click() { try { foo(); } catch(ApplicationException ex) { Log.UserWarning(ex); MessageVox.Show(ex.Message); } catch(Exception ex) { Log.CodeError(ex); MessageBox.Show("Internal error."); } } 

Cela permet de faire la différence entre:

  • C # erreur de code système que je dois réparer.
  • Erreur utilisateur “normale” qui ne nécessite pas de correction de ma part.

Je sais qu’il n’est pas recommandé d’utiliser ApplicationException, mais cela fonctionne très bien car il y a très peu de classes qui ne respectent pas le modèle ApplicationException.