Frage

An welchem Punkt würde Sie Ihre eigenen exception-Klasse vs.Verwendung von java.lang.Ausnahme?(Alle die Zeit?Nur wenn es verwendet wird, außerhalb des Pakets?Nur wenn es muss enthalten erweiterte Logik?etc...)

War es hilfreich?

Lösung

Ich glaube, Sie brauchen, Fragen Sie sich eine etwas andere Frage "Welche Vorteile hat die Schaffung einer neuen Ausnahme geben mir oder Entwickler, die mit meinem code?" Wirklich der einzige Vorteil, den es Ihnen oder anderen Menschen ist die Fähigkeit, die Ausnahme behandeln.Das scheint wie eine offensichtliche Antwort, aber eigentlich ist es nicht.Sie sollten nur das behandeln von Ausnahmen, die man vernünftigerweise erholen.Wenn die Ausnahme, die Sie werfen, ist ein wirklich schwerwiegender Fehler, warum geben Entwicklern die chance zu mis-handle it?

Mehr in die Tiefe Diskussion: Benutzerdefinierte Ausnahmen:Wann sollte man diese erstellen?

Andere Tipps

Grund eins:

Brauchen, um spezielle Sachen.Wenn der aufrufende code muss deal mit einem bestimmten außergewöhnlichen Bedingung, die Sie unterscheiden müssen Ihre Ausnahme, und Java unterscheidet Ausnahmen mit verschiedenen Arten, so dass Sie brauchen, um schreiben Ihre eigenen.

Im Grunde, wenn jemand zu schreiben:

catch(ExistingException e) {
  if({condition}) {
    { some stuff here}
  }
  else {
    { different stuff here}
  }
}

Sie wahrscheinlich schreiben wollen, eine bestimmte Erweiterung;catch-Exception-matching ist klarer als die Bedingungen, IMHO.

Denken Sie daran:Ihre neue Ausnahme werden können eine Unterklasse von RuntimeException

Grund zwei:

API-Konsolidierung.Wenn Sie schreiben, eine Schnittstelle, und Sie haben mehrere Implementierungen, ist es möglich, dass Sie anrufen verschiedenen APIs mit einem ganzen Bündel von verschiedenen nicht-RuntimeExceptions geworfen:

interface MyInterface {
  void methodA();
}

class MyImplA {
  void methodA() throws SQLException { ... }
}

class MyImplB {
  void methodA() throws IOException { ... }
}

Wollen Sie wirklich MyInterface.methodA zu werfen SQLException und IOException?Dann ist es vielleicht sinnvoll, wickeln Sie die möglichen Ausnahmen in eine benutzerdefinierte Ausnahme.Die wiederum kann eine RuntimeException.Oder auch RuntimeException selbst...

Ich glaube, dass:

catch (Exception e) {
   ...
}

...ist ein antipattern, das vermieden werden sollte.Vielleicht möchten Sie ein zentrales breiten Fang irgendwo in Ihrer Anwendung, um einen Fehler zu protokollieren und verhindern, dass die gesamte Anwendung zu beenden - doch unter Ihnen verstreut, wohl oder übel, schlecht.

Warum:

try {
   if(myShape.isHidden()) {
      throw new Exception();
   }
   // More logic
} catch (Exception e) {
   MyApp.notify("Can't munge a hidden shape");
}

Also versuchen Sie dies, und aufgrund eines Programmierfehlers, myShape ist null.Ein NullPointerException wird ausgelöst, wenn die Laufzeit versucht, derefence myShape.Dieser code meldet eine versteckte Form, bei der es sein sollte reporting einen null-Zeiger.

Entweder machen Sie Ihre eigene Ausnahme, oder finden Sie einen entsprechend spezialisierten Ausnahme in der API.Es ist nicht so, wenn die Erweiterung der Exception oder RuntimeException ist belastend.

Wenn ich wollen zu behandeln, meine Ausnahmen anders als alle anderen ist.Wenn ich fangen wollen mine und sich ausbreiten jeder andere ist, oder wenn ich mich fangen wollen, jemand anderes und vermehren von mir, oder wenn ich mich fangen wollen beide aber behandeln Sie anders, dann definiere ich eine separate Klasse für meine Ausnahmen.Wenn ich will, Sie zu behandeln alle die gleichen, entweder durch Vermehrung oder durch das fangen beide (und das tun die gleiche Sache so oder so mit den Gefangenen Ausnahmen), die ich verwenden die standard-Klasse.

WENN es ist eine bestehende Ausnahme mit der Sprache, Laufzeitumgebung und Bibliotheken verwenden, die es SONST erstellen Sie Ihre eigenen, dokumentieren Sie gut, und das sollte funktionieren in 99% der Fälle.

Software erfasst Bedeutung.

Es gibt fast keine Gründe für das werfen einer bestehenden Ausnahme:die JVM bereits übernimmt das für Sie.Ihre version Ihrer Ausnahme nicht wirklich präzise und werfen "Ausnahme" ist nicht sinnvoll, entweder.

Sie haben vielleicht ein DataFormatException da ein parsing-Algorithmus, die Sie schrieb.Dies ist jedoch selten.

Wenn Ihr Programm trifft auf eine außergewöhnliche situation, es ist fast immer eindeutig zu Ihrem Programm.Warum Kraft-passen Sie Ihre außergewöhnlichen situation, in eine bestehende Ausnahme?Wenn es ist einzigartig in Ihrem Programm, dann...naja...es ist einzigartig.Nennen Sie es so.

Nicht, jedoch, eine einzigartige exception-Klasse für jede eindeutige Nachricht.Eine Ausnahme Klasse kann viele Variante Nachrichten und unterstützende details.

Die Python Faustregel, übersetzt Java, ist zu definieren eindeutig die Ausnahmen auf der Paket-Ebene.[In Python, schlagen Sie vor, die Ausnahmen auf die "Modul" - Ebene, etwas, das nicht genau zu übersetzen, um Java.]

Beginnen Sie stets mit den Allgemeinen exception-Klassen, und dann, wenn eine not erscheint, es zu handhaben speziell, ändern Sie es.

  1. Beim erstellen einer Methode, ersten mal, lassen Sie es Ausnahmen Durchlaufen.

  2. Wenn es da Ausnahmen gibt, die behandelt werden müssen, können diese entweder nur definiert wirft oder gewickelt einiger Laufzeit-exception oder gewickelt eigene wirft Ausnahme.Ich bevorzuge die Laufzeit Ausnahmen in vielen Fällen.Definition wirft definition sollte vermieden werden, bis es notwendig ist, für die es aus API-Sicht.

  3. Später, wenn die Notwendigkeit erscheint, das zu tun spezifische Behandlung für eine Ausnahme in einigen Anrufer, kommen Sie zurück und erstellen Sie die neue Ausnahme für es.

Der Punkt ist, vermeiden Sie zusätzliche Arbeit, bevor man weiß, was benötigt wird.

Ich kann mir nicht vorstellen, speziell, werfen java.lang.Ausnahme wenn ein Objekt/Klasse/Methode ein problem hatte.Es ist zu generisch - wenn du nicht gehst, zu erstellen Sie Ihre eigenen Exception-Klasse, scheint mir, wie es sollte mindestens eine weitere bestimmte Exception-Typ in der API.

Ich würde verwenden Sie die Ausnahmen aus der Java-API, wenn die Ausnahme bezieht sich auf die API.Aber wenn eine außergewöhnliche situation Eintritt, dass ist einzigartige zu meinem eigenen API-dann werde ich erstellen Sie eine Ausnahme für diese.Zum Beispiel, wenn ich ein Range-Objekt mit zwei Eigenschaften min und max, und die invariante min <= max dann erstelle ich eine Ausnahme InvalidRangeException.

Wenn ich Schreibe code, das hilft, weil ich weiß, wenn die Ausnahme stammt, weil ich gegen eine meiner eigenen Bedingungen oder seine etwas aus der Java-API.

In den meisten Fällen ist es nicht sinnvoll, Sie zu erstellen Sie Ihre eigenen exception-Klasse.

Es gibt eine Tendenz in unerfahrenen Programmierern, Ihre eigenen exception-Klasse nur so können Sie einen Namen verwenden, der mehr ist bezeichnend für die Art des Fehlers.So finden Sie Klassen wie FTPInitializationException, DAOFactoryException etc.auch wenn solche Ausnahmen werden nicht anders behandelt als standard-Ausnahmen.Dies ist eindeutig ein anti-Muster, das vermieden werden sollte.

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