Sollte meine benutzerdefinierte Ausnahme eine Ausnahme erben, die ihnen ähnelt oder nur von Exception erbt?

8

Ich erstelle einige benutzerdefinierte Ausnahmen in meiner Anwendung.

Wenn ich eine Ausnahme habe, die nach dem Testen des Zustands eines Arguments ausgelöst wird, Oder ich habe eine Ausnahme, die nach dem Testen ausgelöst wird, dass ein int im richtigen Bereich ist, sollten meine Ausnahmen ArgumentException und IndexOutOfRangeException erben oder sollten sie nur erben Ausnahme?

    
Sruly 23.06.2009, 13:09
quelle

10 Antworten

11

Da Vererbung verwendet wird, um anzugeben, welche Ausnahmen abgefangen werden sollen, sollten Sie dies in erster Linie bei einer Entscheidung berücksichtigen.

Denken Sie an eine IOException, die zusätzliche Informationen oder eine andere ArgumentException als ArgumentOutOfRangeException oder ArgumentNullException enthält.

    
Lucero 23.06.2009, 13:17
quelle
7

Wenn Sie davon ausgehen, dass Sie wirklich eine benutzerdefinierte Ausnahme benötigen, würde ich eher von der Exception als von der Ausnahme profitieren, die Sie suchen, und nicht nur von Exception.

Ich habe festgestellt, dass unter den meisten Bedingungen die Verwendung der richtigen Formulierung in Ihrer Exception-Nachricht normalerweise ausreicht, um eine ganz neue Ausnahme zu erstellen.

Wie unterscheidet sich beispielsweise throw new IntOutOfProperRangeException(); signifikant von throw new ArgumentOutOfRangeException("The int value was too large?");

?     
AllenG 23.06.2009 13:16
quelle
3

Ich denke, es ist immer sicherer, einen neuen Ausnahmetyp zu erstellen. Wenn Sie die Art und Weise der Behandlung ändern müssen, ist es einfacher, Fälle zu finden, in denen Sie sich befinden oder möglicherweise damit umgehen. Es ist viel einfacher, MyException zu finden, als den spezifischen Fall von ArgumentOutOfRangeException zu finden. Sie scheinen in der Ausnahme einige zusätzliche Informationen bereitstellen zu können, und es ist nicht zu viel Arbeit, eine Ausnahme zu erstellen.

Ich neige auch dazu, eine Basisanwendungsklasse wie MyBaseException zu erben, und stelle sicher, dass XML-Kommentare für die Ausnahme / n hinzugefügt werden.

    
eschneider 23.06.2009 15:17
quelle
2

Ich bin nur neugierig, warum würdest du nicht wirklich die Exceptions verwenden, die schon da sind? Es klingt, als ob diese Ausnahmen genau das sind, was Sie brauchen, warum sind Sie dagegen, diese zu verwenden?

    
BFree 23.06.2009 13:14
quelle
2

Persönlich, wenn ich einen Indexer habe und der Indexwert außerhalb des Bereichs liegt, würde ich einfach die vorhandene IndexOutOfRangeException werfen, ich würde nicht die Mühe erben, davon zu erben.

Wenn Sie nur von ähnlichen, aber nicht genau den gleichen Ausnahmen sprechen, dann schauen Sie sich das im Framework bereitgestellte Muster an. Es sieht nicht so aus, als würde dies einen Sinn ergeben, Vererbung beschreibt eine "ist-a" -Beziehung.

    
AnthonyWJones 23.06.2009 13:14
quelle
1

Wenn Sie der Ausnahme keine zusätzlichen Daten hinzufügen müssen, verwende ich einfach die nativen .NET-Ausnahmen wie IndexOutOfRangeException.

Wenn Sie jedoch etwas mit Ihrer Ausnahme verknüpfen wollten, die Sie nativ mit IndexOutOfRangeException nicht ausführen können, würde ich davon erben. Der Vorteil hierbei ist, dass Sie entweder Ihren neuen benutzerdefinierten Ausnahmetyp oder IndexOutOfRangeException abfangen können. Wenn Sie den Basistyp abfangen, haben Sie natürlich keine zusätzlichen Eigenschaften und so.

    
Aaron Daniels 23.06.2009 13:20
quelle
1

IMHO, es gibt kein Problem, das von einer anderen Ausnahme erbt. Es macht den Zweck dieser Ausnahme noch deutlicher. Stellen Sie jedoch sicher, dass alles, was für die ParentException gilt, auch für die von Ihnen erstellte ChildException gilt. Andernfalls könnte das Problem mit dem Problem "Square extends Rectangle" enden ...

    
Samuel Carrijo 23.06.2009 13:21
quelle
0

Fast immer verwende ich die IllegalArgumentException (Nullen und / oder Werte außerhalb des Bereichs) und IllegalStateException für alles, was nicht spezifischer ist als IOException, SQLException, Null ...

    
ATorras 23.06.2009 13:20
quelle
0

Wenn Sie nur die generische Exception verwenden, können Sie bestimmte Ausnahmen, die für Ihre Anwendung erforderlich sind, nicht abfangen. Wenn Sie nur

verwenden %Vor%

Sie werden jede Ausnahme abfangen, ohne nach bestimmten Fehlern filtern zu können.

Ein weiterer Grund für die Erstellung einer benutzerdefinierten Ausnahme besteht darin, anwendungsspezifische Ausnahmen zu behandeln, die aus verschiedenen Gründen auftreten können. Dadurch kann eine benutzerdefinierte Ausnahme ausgelöst werden, die mit der Ausnahme verknüpfte Nachricht jedoch angepasst werden. Es gibt mir auch eine andere Ebene der Fehlerbehandlung, die für meine spezifische Anwendung ist.

Zum Beispiel habe ich eine Enigineering-Anwendung, die Riemenantriebssysteme dimensioniert. Die DLL steht auch anderen Benutzern zur Verfügung. Ich habe eine Anwendungsausnahme, die ausgelöst wird, wenn bei der Auswahl ein Fehler auftritt. Der Grund für den Fehler kann viele Ursachen haben (ungültige Antriebsgeschwindigkeit, falsche Leistungsanforderungen usw.). Da es viele Gründe für einen Fehler gibt, erlaubt mir eine benutzerdefinierte Anwendungsausnahme, bestimmte Details für den Fehler anzugeben.

Dies ermöglicht es mir auch, Benutzern zu dokumentieren, dass Methodenaufrufe anwendungsspezifische Ausnahmen auslösen, die sie behandeln müssen.

Wenn Sie die Exception-Klasse erben, stellen Sie sicher, dass Sie die Konstruktoren in der Basisklasse implementieren, die eine Nachricht, eine Nachricht + innere Ausnahme und eine serialisierte Ausnahme enthalten.

Hier ist ein Beispiel, das ich habe.

%Vor%     
John Cuckaroo 23.06.2009 14:13
quelle
0

Ich denke, dass alles davon abhängt, ob Sie Ihre ArgumentNotInPersitableState-Ausnahme als ArgumentOutOfRange abfangen wollen. Wenn es einen solchen catch-Block gibt (oder wenn Sie ein Framework schreiben, das vermutlich von anderen verwendet wird), dann sollten Sie den entsprechenden Ausnahme-Typ erben.

    
RA. 23.06.2009 15:03
quelle

Tags und Links