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

74

Was ist die beste Vorgehensweise beim Erstellen Ihrer Ausnahmeklassen in einer .NET-Lösung: Ableiten von System.Exceptionoder von System.ApplicationException?

Pontus
quelle

Antworten:

63

Laut Jeffery Richter im Buch Framework Design Guidelines:

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

Es sollte eine Bedeutung haben, da Sie möglicherweise "alle" Anwendungsausnahmen abfangen können, aber das Muster wurde nicht befolgt und hat daher keinen Wert.

Fryguybob
quelle
3
Unglaublich, wenn man das Microsoft Press-Material für die MCTS 70-536-Prüfung betrachtet, sagt man eindeutig das Gegenteil ... gah!
Dave Lawrence
Vertrauen Sie niemals vollständig den MS-Prüfungsbüchern. Ich habe nur wenige davon gelesen - immer voller Fehler.
user1068352
Dies beantwortet die Frage nicht wirklich. Wollen Sie damit sagen, dass benutzerdefinierte Anwendungsausnahmen von erben sollten Exception? Wenn ja, könnten Sie das sagen?
Patrick Szalapski
28

Sie sollten benutzerdefinierte Ausnahmen von ableiten System.Exception.

Sogar MSDN sagt jetzt zu ignorieren ApplicationException:

Wenn Sie eine Anwendung entwerfen, die eigene Ausnahmen erstellen muss, wird empfohlen, benutzerdefinierte Ausnahmen von der Exception-Klasse abzuleiten. Es wurde ursprünglich angenommen, dass benutzerdefinierte Ausnahmen von der ApplicationException-Klasse abgeleitet werden sollten. In der Praxis wurde jedoch kein signifikanter Mehrwert festgestellt. Weitere Informationen finden Sie unter Best Practices für den Umgang mit Ausnahmen .

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

Blorgbeard ist raus
quelle
1
Das Zitat sagt das, aber ok, bearbeitet, um expliziter zu sein.
Blorgbeard ist am
18

ApplicationExceptionals nutzlos angesehen wird ein starkes und kritisches Argument dagegen ApplicationException.

Fazit: Benutze es nicht. Ableiten von Exception.

Konrad Rudolph
quelle
Ja, Konrad hat es richtig. In einem ähnlichen Zusammenhang: Eine andere Sache, die für nützlich (oder "Best Practice") gehalten wurde, aber nicht wirklich ist, ist die Implementierung von ICloneable .
Craig
13

Die Autoren des Frameworks selbst halten ApplicationException für wertlos:

https://web.archive.org/web/20190904221653/https://blogs.msdn.microsoft.com/kcwalina/2006/06/23/applicationexception-considered-useless/

mit einem netten Follow-up hier:

https://web.archive.org/web/20190828075736/https://blogs.msdn.microsoft.com/kcwalina/2006/07/05/choosing-the-right-type-of-exception-to-throw/

Im Zweifelsfall folge ich ihrem Buch Framework Design Guidelines.

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

Das Thema des Blogposts wird dort weiter diskutiert.

rp

rp.
quelle
1

Ich bin es gewohnt:

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 Systemfehler, den ich reparieren muss.
  • "Normaler" Benutzerfehler, der von mir nicht korrigiert werden muss.

Ich weiß, dass die Verwendung von ApplicationException nicht empfohlen wird, aber es funktioniert hervorragend, da es nur sehr wenige Klassen gibt , die das ApplicationException-Muster nicht berücksichtigen.

Olivier de Rivoyre
quelle
2
Sehr wenige, die Sie kennen. Personen, die die Framework Design Guidelines befolgen, werden nicht von ApplicationException abgeleitet. Wenn Sie dieses Muster beibehalten möchten, müssen Sie einen eigenen Typ wie MyApplicationExcptionBase erstellen und alle Ihre benutzerdefinierten Ausnahmen daraus ableiten. Übrigens heißt es in den Richtlinien, dass nur wenige abgeleitete Ausnahmetypen erstellt werden sollen.
John Saunders
Sie haben Recht: Wenn ich heute von vorne anfangen müsste, würde ich eine "UserError" -Ausnahme erstellen. Trotzdem werde ich meinen alten Code nicht umgestalten: Es ist nicht sehr kritisch.
Olivier de Rivoyre