Frage

Wann sollten Sie werfen eine benutzerdefinierte Ausnahme?

z.B.Ich habe einige code, der eine Verbindung zu einem server.Der code, der die Verbindung mit dem server löst eine IOException aus, wenn es scheitert zu verbinden.Im Kontext der Methode genannt, ist dies in Ordnung.Es ist auch in Ordnung, in den Netzwerk-code.

Aber da dies nicht mit einem Anschluss (und deshalb nicht arbeiten) die Ausnahme geht den ganzen Weg bis zur Benutzeroberfläche.In dieser Phase, eine IOException aus, ist sehr ambigous.So etwas wie NoConnectionException besser werden würde.

So, meine Frage ist:Zu welchem Zeitpunkt sollten Sie abfangen einer Ausnahme, um stattdessen werfen eine (benutzerdefinierte) Ausnahme, dass besser passt die Abstraktion?

War es hilfreich?

Lösung

Ich würde erwarten, dass Ausnahmen zu sprechen in Bezug auf das, was ich habe, fragte der ursprünglichen Methode zu tun.z.B.

read -> ReadException
connect -> ConnectException
buildPortfolio -> FailedToBuildPortfolioException

etc.Diese Zusammenfassungen Weg, was Los ist unter der Decke (d.h.verbinden Sie sich via sockets, etc.).Als Allgemeine Regel, wenn ich eine Schnittstelle für eine Komponente, die ich oft erstellen Sie eine entsprechende Ausnahme oder eine Reihe von Ausnahmen.Mein interface aufgerufen werden Component, und meine Ausnahmen sind in der Regel ComponentException (z.B. RateSource und RateSourceException).Es ist konsistent und einfach zu exportieren, um verschiedene Projekte wie eine komplette Komponente.

Der Nachteil ist, dass Sie erstellen Sie ganz viele Ausnahmen, und Sie müssen möglicherweise führen Sie eine ganze Menge von übersetzungen.Der Vorteil ist, dass (wie Sie herausgefunden haben), bekommen Sie wenig bis gar keine Abstraktion Leckage.

An einem gewissen Punkt während der Hierarchie von Methodenaufrufen (und damit Ausnahmen) Sie können entscheiden, dass keine Genesung erfolgen kann (oder es ist an einer ungeeigneten Stelle) und übersetzen Sie zu den ungeprüften Ausnahmen werden später behandelt.

Andere Tipps

Ich weiß, dieser ist markiert als "language-agnostic", aber ich glaube nicht, dass es wirklich ist.Aus einem C++ - Perspektive, erwarte ich, dass nur sehr wenige grundlegende Vorgänge auslösen einer Ausnahme - die C++ Standard-Bibliothek verwendet nur Ausnahmen in ganz wenigen Orten.Also ist mein eigener code ist oft der erste Ort, wo Ausnahmen erzeugt werden können.In diesem code habe ich aus wie eine sehr flache Hierarchie ich will nicht zu spaßen mit Hunderten von catch () - Klauseln, die später in die code, und haben nie verstanden, Java und C#'s scheinbare Besessenheit mit dem erstellen von Barock heirarchies der Klassen-und namespace.

Also, für mein C++ - code - eine Art von Ausnahme, die eine aussagekräftige Fehlermeldung, pro Bibliothek.Und eine für die endgültige ausführbare Datei.

Ich denke, es gibt zwei Fragen, die hier versteckt:a) Wann sollte man verstecken eine Ausnahme hinter einer anderen Ausnahme.b) Wann sollte man eine benutzerdefinierte Ausnahme.

a) ich würde sagen:wenn jemals eine Ausnahme reist über die Grenze der beiden Schichten in der Anwendung, sollte es erhalten, versteckt hinter einer Ausnahme, die ist mehr apropriate für die neue Ebene ein.Beispiel:weil Sie dabei einige remote-Sachen, die Sie bekommen ConnectionWhatEverException.

Aber der Anrufer sollten sich nicht bewusst sein, der Probleme mit der Verbindung.Da will er nur, um einige service durchgeführt, so bekommt er eine ServiceOutOfOrderException.Der Grund dafür ist:Im inneren der Schicht, tut remoting, Sie könnte etwas tun, um sinnvoll mit einer ConnectionException ("wiederholen", schreiben Sie in eine backout-Warteschlange ..).Sobald Sie verlassen, die Ebene, niemand weiß, wie man mit einem ConnectionException.Aber Sie sollten in der Lage sein, zu entscheiden, was tun, wenn der Dienst nicht funktioniert.

b) Wenn es keine passenden bestehende Ausnahme.Es gibt ein paar nützliche Ausnahme in Java-Beispiel.Ich benutze IllegalState und IllegalArgument ziemlich oft.Ein starkes argument für eine neue exception-Klasse ist, wenn Sie einige nützliche Kontext zur Verfügung zu stellen.Zum Beispiel den Namen des Dienstes, die fehlgeschlagen ist, könnte ein argument einer ServiceFailedException.Nur nicht, erstellen Sie eine Klasse für jede Methode aufrufen, oder etwas zu diesem-Effekt.100 Exception-Klassen sind nicht ein problem, solange Sie haben verschiedene Verhalten (d.h.zumindest anderen Felder).Falls Sie unterscheiden sich nur durch Namen und befinden sich auf der gleichen Abstraktionsebene, machen Sie zu einer Ausnahme, und legen Sie die anderen Namen in der Nachricht oder einem einzelnen Feld des exception-Klasse.

c) zumindest in java gibt es die Diskussion darüber, geprüft Ausnahmen.Ich wickeln Sie diese direkt in einen ungeprüften ein, denn ich hasse die Art überprüft.Aber das ist eher eine Meinung dann beraten.

Ist es eine Falle, wo Sie bekommen würden, NoConnectionException, die ist nicht verursacht durch ein IO Problem?Umgekehrt ist es, zu wissen, ob die Ursache ist IO-basiert oder nicht zu helfen, der client wiederherstellen sinnvoll?

Wann sollten Sie werfen eine benutzerdefinierte Ausnahme?

I.Wenn Sie können bieten mehr (Diagnose -) Informationen.

Hinweis:diese zusätzlichen Informationen können nicht verfügbar sein in dem Ort, wo die ursprüngliche Ausnahme (IOException) geworfen wurde.Progressive Ebenen von Abstraktionen, die möglicherweise mehr Informationen hinzufügen gefällt, was hast du versucht zu tun, was dazu führte, diese Ausnahme?

II.Wenn Sie müssen nicht aussetzen Durchführung details:d.h.Sie möchten, dass die illusion (von?) Abstraktion, um fortzufahren.

Dies kann wichtig werden, wenn die zugrunde liegende Implementierung Mechanismus ändern können.Verpackung die zugrunde liegende Ausnahme in eine benutzerdefinierte Ausnahme ist eine gute Möglichkeit, isolierenden Ihre Kunden von Implementierungsdetails (durch anheben der Ebene der Abstraktion)

III.Beide I und II

HINWEIS:Ferner wird Ihre clients sollten in der Lage sein, Sie zu tune in und den genauen Umfang der Informationen, die Sie interessieren, oder vielmehr, Sie sollten in der Lage sein zu Stimmen, was Sie nicht interessiert sind.Es ist also eine gute Idee, leiten Sie Ihre benutzerdefinierten Ausnahmen von IOException.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top