Was können wir mit einer benutzerdefinierten Ausnahme tun?

8

Ich weiß nicht, was wir mit einer benutzerdefinierten Ausnahme machen können, was wir nicht mit einer eingebauten Ausnahme machen können. Es scheint eine naive Frage zu sein, aber ich habe keine Ahnung davon. Was denkst du?

    
Nam G VU 21.09.2010, 11:18
quelle

7 Antworten

11

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.

    
Andrew Barber 21.09.2010, 11:23
quelle
8

Es ist nützlich, eine benutzerdefinierte Ausnahme zu erstellen, wenn:

  • Es gibt keine integrierte Ausnahme, die den Typ der Fehlerbedingung ausdrückt, die Sie haben.
  • Sie möchten nur diesen speziellen Typ von Ausnahme abfangen und keine Ausnahmen vom Framework.

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.

    
Mark Byers 21.09.2010 11:21
quelle
6

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.

%Vor%

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.

    
Albin Sunnanbo 21.09.2010 11:23
quelle
3

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.

    
quelle
3

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!)

    
Ohad Schneider 21.09.2010 12:39
quelle
3

Ein Ärgernis mit den eingebauten Ausnahmen besteht darin, dass es keine systematische Unterscheidung zwischen Ausnahmen gibt, die darauf hinweisen, dass

  1. Eine Operation ist fehlgeschlagen, aber eine Wiederholung könnte erfolgreich sein; Der Systemzustand ist so, wie er vor dem Versuch war.
  2. Eine Operation ist fehlgeschlagen, und eine Wiederholung wird wahrscheinlich nicht helfen. nichtsdestoweniger ist der Systemzustand so, wie er war, bevor die Operation versucht wurde;
  3. Eine Operation ist so gescheitert, dass sie möglicherweise etwas anderes korrumpiert.

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.

    
supercat 21.09.2010 15:24
quelle
2

Mit benutzerdefinierten Ausnahmen können Sie zwei Dinge tun:

  1. Erfassen Sie benutzerdefinierte typisierte Daten in der Ausnahme
  2. Erfassen eines benutzerdefinierten Ausnahmeereignisses

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.

    
cjk 21.09.2010 11:31
quelle

Tags und Links