Um Ausnahmen auszulösen, verwende ich normalerweise integrierte Ausnahmeklassen, z . B. ArgumentNullException
und NotSupportedException
. Manchmal muss ich jedoch eine benutzerdefinierte Ausnahme verwenden und in diesem Fall schreibe ich:
class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }
und so weiter. Dann werfe ich und fange diese in meinem Code. Aber heute bin ich auf die ApplicationException
Klasse gestoßen - sollte ich das stattdessen verwenden? Wofür ist das?
Es scheint ineffizient zu sein, viele effektiv identische Ausnahmeklassen mit unterschiedlichen Namen zu haben (normalerweise benötige ich keine individuellen Funktionen). Aber ich mag die Idee nicht, ein Generikum zu fangen ApplicationException
und zusätzlichen Code verwenden zu müssen, um den Fehler zu bestimmen.
Wo sollte ApplicationException
mein Code passen?
quelle
Antworten:
Nach den Ausführungen in msdn:
Leiten Sie sie von ab
Exception
. Außerdem sehe ich kein Problem beim Erstellen neuer Ausnahmen für Ihre Fälle, solange dies gerechtfertigt ist. Wenn Sie auf einen Fall stoßen, in dem das Framework bereits eine Ausnahme enthält, verwenden Sie diesen, andernfalls rollen Sie Ihre eigene.quelle
ApplicationException
nutzlos zu sein und gibt es nur wegen der Abwärtskompatibilität?Die kurze Antwort lautet: Nirgendwo.
Es ist ein Relikt der Vergangenheit, in dem Microsoft beabsichtigte, dass Entwickler alle ihre benutzerdefinierten Ausnahmen von ApplicationException erben. Kurz darauf änderten sie ihre Meinung und rieten, dass benutzerdefinierte Ausnahmen von der Basisausnahmeklasse abgeleitet werden sollten. Siehe Best Practices für den Umgang mit Ausnahmen in MSDN.
Einer der am weitesten verbreiteten Gründe hierfür ist ein Auszug aus Jeffery Richter in den Framework Design Guidelines :
Da haben Sie es also. Die Zusammenfassung lautet, dass ApplicationException nicht schädlich , sondern nur nutzlos ist .
quelle
Whizbang
entscheidet, dass sie alle Ausnahmen unter einer gemeinsamen Hierarchie haben möchte, die VerwendungApplicationException
für diesen Zweck wirklich keinen Vorteil gegenüber der Verwendung einer benutzerdefiniertenWhizbangException
Basisklasse bietet . Das schwerwiegendere Problem in der Ausnahmehierarchie von .net liegt jedoch nicht darinApplicationException
, sondern darin, dass Ausnahmen nicht in Kategorien unterteilt werden können, die wahrscheinlich die Anwendung betreffen, wahrscheinlich den Thread beeinträchtigen und lokale Probleme betreffen, zusammen mit der Unfähigkeit, diese zu haben sinnvolle "zusammengesetzte" Ausnahmen.finally
Blockierens ausgelöst wird , während eine andere Ausnahme ansteht,catch
Blöcke weiter oben im Aufrufstapel ausgelöst werden sollten, wenn sie mit einer verschachtelten Ausnahme übereinstimmen , andere Ausnahmen jedoch anstehen, damit sie beendet werden Eincatch
Block würde zu einem anderencatch
Block innerhalb desselbentry
Blocks übergehen (falls vorhanden), und das Verlassen einesfinally
Blocks mit ausstehenden Ausnahmen würde zum nächsten äußerencatch
oder springenfinally
.Im ursprünglichen Entwurf in .NET 1.0 war geplant, dass das Framework selbst ausgelöst
SystemException
und abgeleitet wird. während Benutzeranwendungen - werfenApplicationException
und abgeleitet.Aber später in .NET 2.0 wurde das gelöscht.
Also ableiten von
Exception
.quelle