Der Grund für die verschiedenen Arten von Ausnahmen besteht darin, dass Sie in der Lage sind, mit Ihren Handlern nur die gewünschten zu fangen und die anderen auf dem Stapel weiterlaufen zu lassen. So können Sie Ausnahmen für bestimmte, gelegentlich erwartete Situationen nur nach dem Typ der Ausnahme abfangen.
Sie müssen vielleicht gar nicht sehr oft Ihre eigenen erstellen. Aber wenn Sie das tun, wäre es, weil Sie in der Lage sein müssen, einen Ausnahmetyp spezifischer als das, was verfügbar ist, zu werfen und zu erfassen, und vielleicht mit zusätzlichen Informationen, die beigefügt werden.
Es ist nützlich, eine benutzerdefinierte Ausnahme zu erstellen, wenn:
Aber normalerweise, wenn es bereits eine Ausnahme im Framework gibt, die Sie verwenden könnten, ist es besser, sie zu verwenden, anstatt eine eigene Ausnahme für dieselbe Sache zu erstellen.
Sie könnten es verwenden, um spezielle Fehlerbehandlung für Dinge zu implementieren, die mit Ihrer Anwendung zusammenhängen. Angenommen, Sie erstellen eine Bananenanwendung, dann könnten Sie OutOfBananasException
haben. Wenn Ihre Anwendung keine Bananen mehr hat, können Sie die Ausnahme auslösen und sie später mit einer speziellen Fehlerbehandlung abfangen.
Bearbeiten:
Der Grund dafür, dass Sie eigene Exceptions anstelle des eingebauten Exceptions verwenden, ist es, jedem, der Ihren Code liest, oder der Verwendung Ihrer Bibliothek klar zu machen, welche Art von Fehler aufgetreten ist. Sie sollten nur Ihre eigenen Ausnahmen erstellen, wenn Sie keine geeignete integrierte Ausnahme finden können.
Bearbeiten2:
Eine Sache, die Sie mit Ihren eigenen Ausnahmen machen können, die Sie nicht mit eingebaut machen können, ist das Hinzufügen von Eigenschaften, die Dinge über die Fehlerbedingung beschreiben, die der Fehlerhandler möglicherweise verwendet. Wenn Sie eine Ausnahmebedingung haben, die sich auf Kunden bezieht, könnte die Ausnahmebedingung Eigenschaften für den Kundennamen und die Kundennummer enthalten und es dem Fehlerhandler somit ermöglichen, informative Fehlermeldungen für den Benutzer anzuzeigen.
Es gibt nur wenige Ausnahmen in .NET, die auf besondere Weise behandelt werden, wie ThreadAbortException , die (normalerweise) nicht gefangen und gehandhabt und geschluckt werden kann.
Darüber hinaus sind Ausnahmetypen nur Ausnahmetypen. Sie können das gleiche mit Ihren eigenen Ausnahmen machen, die Sie mit den im Framework definierten Ausnahmen machen können.
Die Vorteile von benutzerdefinierten Ausnahmen wurden hier beschrieben, aber bevor Sie Ihre eigenen erstellen, stellen Sie sicher, dass die BCL nicht bereits eine hat, die Ihren Anforderungen entspricht:
Ссылка (Es gibt 141 von ihnen!)
Ein Ärgernis mit den eingebauten Ausnahmen besteht darin, dass es keine systematische Unterscheidung zwischen Ausnahmen gibt, die darauf hinweisen, dass
Es kann nützlich sein, Ausnahmen abzufangen und eine von drei benutzerdefinierten Ausnahmen (Bedeutungen, die oben definiert sind), basierend darauf, wo die Ausnahme abgefangen wurde, erneut zu lösen. Wenn die Ausnahme erneut ausgelöst wird, übergeben Sie die ursprüngliche Ausnahme als InnerException-Parameter.
Übrigens ist es möglich generische Ausnahmen zu definieren. Ich bin mir der Vor- und Nachteile nicht ganz sicher, und ich habe noch nie jemanden anderen gesehen. Man könnte z.B. eine TransientFaultException (von T), die von einer (benutzerdefinierten) TransientFaultException erbt; Eine Anwendung, die eine TimeoutException abfängt, könnte als TransientFaultException (von TimeOutException) erneut ausgelöst und entweder als TransientFaultException (von TimeoutException) oder als TransientFaultException abgefangen werden. Leider müsste man den Typ der Ausnahme kennen, die gelehrt werden soll, um das richtige Generikum zu erzeugen. Wenn eine Ausnahme abgefangen und an eine Factory-Methode für TransientFaultException übergeben werden soll, wird die neue Ausnahme vom Typ TransientFaultException (of Exception) sein, unabhängig davon, welcher Ausnahmetyp ursprünglich ausgelöst wurde.
Mit benutzerdefinierten Ausnahmen können Sie zwei Dinge tun:
Sie sollten nur dann eine benutzerdefinierte Ausnahme erstellen, wenn keine integrierte Ausnahme vorhanden ist, die bei Bedarf behandelt werden kann.
Als Beispiel haben wir in unserer Anwendung DataLayerException
, das ausgelöst wird, wenn die Datenschicht einen Fehler feststellt (und die spezifische DBMS-Ausnahme als innere Ausnahme enthält).
Wir haben auch DataLayerSingleResultNoneException
- das ist, wenn wir ein einzelnes Ergebnis zurück erwarten, aber es gibt kein Ergebnis, und DataLayerSingleResultManyException
, das ist, wenn wir ein einzelnes Ergebnis erwarten, aber viele zurückbekommen. Dies ermöglicht es uns, die verschiedenen Probleme zu erkennen und entsprechend zu handeln.