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?

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.


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


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


13

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.