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?
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.
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?");
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.
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.
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.
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 ...
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%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.