Soll ich benutzerdefinierte Ausnahmen von Exception oder ApplicationException in .NET ableiten?

Was ist die beste Vorgehensweise beim Erstellen von Ausnahmeklassen in einer .NET-Lösung: Um von System.Exception oder von System.ApplicationException ?

Laut Jeffery Richter im Rahmen der Framework Design Guidelines:

System.ApplicationException ist eine class, die nicht Teil des .NET-Frameworks sein sollte.

Es sollte eine gewisse Bedeutung haben, da Sie möglicherweise alle Anwendungsausnahmen “alle” abfangen konnten, aber das Muster wurde nicht befolgt und hat daher keinen Wert.

Sie sollten benutzerdefinierte Ausnahmen von System.Exception .

Sogar MSDN sagt jetzt, ApplicationException zu ignorieren:

Wenn Sie eine Anwendung entcasting, die eigene Ausnahmen erstellen muss, sollten Sie benutzerdefinierte Ausnahmen von der class Exception ableiten. Ursprünglich wurde angenommen, dass benutzerdefinierte Ausnahmen von der ApplicationException-class abgeleitet werden sollten. In der Praxis hat dies jedoch keinen signifikanten Mehrwert ergeben. Weitere Informationen finden Sie unter Bewährte Methoden für die Behandlung von Ausnahmen .

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

ApplicationException als nutzlos betrachtet wird, ist ein starkes und kritisches Argument gegen ApplicationException .

Upshot: benutze es nicht. Ableiten von Exception .

Die Autoren des Frameworks betrachten ApplicationException selbst als wertlos:

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

mit einem schönen Follow-up hier:

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

Im Zweifelsfall befolge ich ihr Buch Framework Design Guidelines.

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

Das Thema des Blogbeitrags wird dort weiter diskutiert.

rp

Ich bin es gewohnt zu tun:

 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."); } } 

Es erlaubt, den Unterschied zu machen zwischen:

  • C # -Code-Systemerrors, den ich reparieren muss.
  • “Normaler” Benutzererrors, der keine Korrektur von mir benötigt.

Ich weiß, dass es nicht empfohlen wird, ApplicationException zu verwenden, aber es funktioniert gut, da es sehr wenige classn gibt , die das ApplicationException-Muster nicht berücksichtigen.