Frage

Ich habe diese Factory-Methode in Java:

public static Properties getConfigFactory() throws ClassNotFoundException, IOException {
    if (config == null) {
        InputStream in = Class.forName(PACKAGE_NAME).getResourceAsStream(CONFIG_PROP);
        config = new Properties();
        config.load(in);
    }
    return config;
}

Und ich möchte, dass die beiden geprüften Ausnahmen in unkontrollierte Ausnahmen verwandeln. Was ist der beste Weg, um dies zu realisieren?

Soll ich nur fangen die Ausnahme und werfen eine neue Runtime die abgefangene Ausnahme als die innere Ausnahme mit?

Gibt es einen besseren Weg, dies zu tun, oder soll ich auch diese in erster Linie versucht werden, zu tun?

EDIT:
Nur um klarzustellen. Diese Ausnahmen tödlich sein, da die Konfigurationsdatei im Wesentlichen auf den Betrieb des Programms ist und alle Ausnahme wird auf der obersten Ebene meines Programms gefangen und eingeloggt sein.

Mein Ziel eine unnötige wirft Ausnahme zu vermeiden, ist, Ausnahme von der Signatur jeder Methode hinzugefügt, die mein Werk nennt.

War es hilfreich?

Lösung

Ein RuntimeException sollte nur verwendet werden, wenn der Kunde nicht aus, was auch immer das Problem ist, wiederherstellen können. Gelegentlich ist es angemessen zu tun, was Sie sprechen, aber häufiger ist es nicht angemessen ist.

Wenn Sie einen JDK verwenden> = 1,4, dann können Sie so etwas wie:

try {
  // Code that might throw an exception
} catch (IOException e) {
  throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
  throw new RuntimeException(e);
}

und die erneut ausgelöst RuntimeException wird die ursprüngliche Ursache enthalten im Inneren haben. Auf diese Weise, jemand an der Spitze des Gewindes der RuntimeException Fang - Threads RuntimeException fängt, so dass sie einfach nicht still sterben, nicht wahr? -. Zumindest aus dem FULL-Stack-Trace der Ursache drucken

Aber wie andere gesagt haben und sagen: Ausnahmen sind aus einem bestimmten Grund überprüft. Dies nur tun, wenn Sie sicher sind, dass Ihre Kunden nicht von dem Problem wiederherstellen können, die Sie als ungeprüfte Ausnahme sind Erneutes Auslösen.

Hinweis: Besser als nur RuntimeException wäre eine spezifischere ungeprüfte Ausnahme zu verwenden, wenn eine verfügbar ist. Zum Beispiel, wenn der einzige Grund, warum Ihre Methode eines ClassNotFoundException werfen könnte, ist da eine Konfigurationsdatei fehlt, könnten Sie ein MissingResourceException erneut auslösen, die eine ungeprüfte Ausnahme ist aber mehr Informationen darüber gibt, warum Sie es zu werfen. Andere gute RuntimeExceptions zu verwenden, wenn sie beschreiben das Problem, das Sie Erneutes Auslösen sind IllegalStateException, TypeNotPresentException und UnsupportedOperationException.

Beachten Sie auch, dass es immer eine gute Idee für Ihre Themen und Runtime bei einem Minimum einzuloggen, es zu fangen. Zumindest diese Weise können Sie, warum Ihre Themen verstehen werden entfernt.

Andere Tipps

Zwei Punkte in Bezug auf Ausnahme Best Practices Handhabung:

  • Anrufer-Code kann nichts tun über die Ausnahme -> Machen Sie es eine ungeprüfte Ausnahme
  • Caller-Code wird einige nützliche Erholung Maßnahmen ergreifen basierend auf Informationen in Ausnahme -> Machen Sie es eine geprüfte Ausnahme

Und Sie können das Runtime mit oder ohne innere Ausnahme werfen, je nachdem, was der Anrufer damit machen kann. Wenn Sie nicht die innere Ausnahme Erneutes Auslösen dann sollten Sie es in Ihrer Methode einzuloggen, wenn wichtig.

Sie sind es die richtige Art und Weise zu tun.

Um geprüfte Ausnahmen passieren zu lassen, obwohl ohne kontrolliert zu werden, müssen Sie sie wickeln in un-geprüfte Ausnahmen.

Denken Sie daran, sind Ausnahmen aus einem Grund überprüft.

Wenn Sie zu viele try - catches vermeiden wollen, fangen beide die Ausnahmen in der Fabrik selbst und behandeln sie dort. Vielleicht gibt eine Standardimplementierung.

Sie Haben , um die Ausnahmen zu behandeln, hier oder irgendwo anders.

Und da dies eine Fabrik ist, ich denke, dass es besser ist, dass diese Ausnahmen in der Fabrik selbst (gleiche Methode oder andere Verfahren) behandelt werden, und eine Standardimplementierung zurück.

Wie auch immer, werden die (Business Function) Anrufer keine Ahnung, was getan werden muss, wenn er eine ClassNotFoundException trifft.

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