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

StackOverflow https://stackoverflow.com/questions/52753

  •  09-06-2019
  •  | 
  •  

Frage

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

War es hilfreich?

Lösung

Laut Jeffery Richter im Buch „Framework Design Guidelines“:

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

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

Andere Tipps

Sie sollten benutzerdefinierte Ausnahmen daraus ableiten System.Exception.

Sogar MSDN sagt jetzt, man solle es ignorieren ApplicationException:

Wenn Sie eine Anwendung entwerfen, die eigene Ausnahmen erstellen muss, wird Ihnen empfohlen, benutzerdefinierte Ausnahmen aus der Ausnahmegeräte abzuleiten.Es wurde ursprünglich angenommen, dass benutzerdefinierte Ausnahmen aus der Anwendungspflichtklasse abgeben sollten;In der Praxis wurde jedoch nicht festgestellt, dass dies keinen signifikanten Wert ergänzt.Weitere Informationen finden Sie unter Best Practices für den Umgang mit Ausnahmen.

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

ApplicationException als nutzlos angesehen ist ein starkes und kritisches Argument dagegen ApplicationException.

Ergebnis:Benutze es nicht.Ergeben sich aus Exception.

Die Autoren des Frameworks selbst halten ApplicationException für 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 folge ich ihrem Buch „Framework Design Guidelines“.

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

Das Thema des Blogbeitrags wird dort weiter besprochen.

rp

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 ermöglicht den Unterschied zwischen:

  • C#-Code-Systemfehler, den ich reparieren muss.
  • „Normaler“ Benutzerfehler, der keiner Korrektur meinerseits bedarf.

Ich weiß, dass die Verwendung von ApplicationException nicht empfohlen wird, aber es funktioniert hervorragend, da es eine gibt sehr wenige Kurse die das ApplicationException-Muster nicht respektieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top