2008-09-10 16 views

Antwort

16

Inherit von System.Exception. System.ApplicationException ist nutzlos und die Designrichtlinien sagen "Do not werfen oder ableiten von System.ApplicationException."

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

+0

Also, was ist der Sinn der Application? – UpTheCreek

+5

Laut Jeffrey Richter bestand die ursprüngliche Idee darin, dass von SystemException abgeleitete Klassen auf Ausnahmen hinwiesen, die von der CLR (oder dem System) selbst ausgelöst wurden, während Nicht-CLR-Ausnahmen von ApplicationException abgeleitet wurden. Da jedoch viele von der CLR ausgelöste Ausnahmeklassen diesem Muster nicht folgten, verlor die ApplicationException-Klasse jegliche Bedeutung. Der Grund für die Ableitung von dieser Basisklasse besteht darin, dass ein Code in der Aufrufliste die Basisklasse abfangen kann. Es ist jedoch nicht möglich, alle Anwendungsausnahmen abzufangen, da einige CLR-Ausnahmen von ApplicationException erben. –

+0

@MarkCidade: Die Tatsache, dass einige CLR-Ausnahmen von 'ApplicationException' erben, könnte tatsächlich eine gute Sache sein, wenn es eine konsistente Unterscheidung in der Hierarchie zwischen Ausnahmen gibt, die bedeuten" Die Operation konnte nicht erfolgreich sein, aber der Versuch hat nichts bewirkt wenn du darauf vorbereitet bist, großartig ", versus" Irgendetwas ist so schrecklich schiefgelaufen, dass fast alles als korrupt angesehen werden sollte. Die einzigen Gründe, die Dinge nicht sofort zu beenden, wären, wenn man diagnostische Informationen erfassen oder eine automatische auslösen möchte Neustart, zuerst. " Schade, dass es keinen Unterschied gibt. – supercat

1

Ich denke, dass die wichtigste Sache, die man sich merken sollte, wenn man mit Ausnahmen auf jeder Ebene (Gewohnheit machen, werfen, fangen) ist, dass Ausnahmen nur für außergewöhnliche Bedingungen gelten.

1

Die Basis Ausnahme von dem alle anderen Ausnahmen erben von System.Exception ist, und das ist, was sollten Sie erben, außer natürlich, Sie eine Verwendung für Dinge wie, sagen wir, Standardmeldungen von a spezifischere Ausnahme.

5

Es gibt ein Code-Snippet dafür. Verwende das. Plus, überprüfen Sie Ihre Code-Analyse danach; Das Snippet lässt einen der Konstruktoren aus, die Sie implementieren sollten.

26

Geben Sie in der C# IDE "Ausnahme" ein und drücken Sie TAB. Dies wird erweitert, um Sie beim Schreiben eines neuen Ausnahmetyps zu unterstützen. Es gibt Kommentare mit Links zu einigen Diskussionen über Ausnahmepraktiken.

Persönlich bin ich ein großer Fan von vielen kleinen Klassen zu schaffen, bei denen sich auch Ausnahmetypen erstrecken. Um zum Beispiel die Foo-Klasse in schriftlicher Form, kann ich wählen zwischen:

  1. throw new Exception("Bar happened in Foo");
  2. throw new FooException("Bar happened");
  3. throw new FooBarException();

wo

class FooException : Exception 
{ 
    public FooException(string message) ... 
} 

und

class FooBarException : FooException 
{ 
    public FooBarException() 
     : base ("Bar happened") 
    { 
    } 
} 

Ich bevorzuge die dritte Option, weil ich es als eine OO-Lösung sehe.

Verwandte Themen