117 Stimmen

Ist es eine schlechte Praxis, Throwable zu fangen?

Ist es eine schlechte Praxis, sich Throwable ?

Zum Beispiel etwas in der Art:

try {
    // Some code
} catch(Throwable e) {
    // handle the exception
}

Ist dies eine schlechte Praxis oder sollten wir so spezifisch wie möglich sein?

2voto

Gili Punkte 80842

Generell sollten Sie vermeiden, sich zu verfangen Error s, aber mir fallen (mindestens) zwei konkrete Fälle ein, in denen dies angebracht ist:

  • Sie wollen die Anwendung als Reaktion auf Fehler herunterfahren, insbesondere AssertionError die ansonsten unbedenklich ist.
  • Implementieren Sie einen Thread-Pooling-Mechanismus ähnlich wie ExecutorService.submit() die es erforderlich macht, dass Sie Ausnahmen an den Benutzer weiterleiten, damit dieser sie bearbeiten kann.

1voto

Throwable ist die Oberklasse für alle Fehler und Auslösungen. Wenn Sie Throwable in einer catch-Klausel verwenden, fängt es nicht nur alle Ausnahmen, sondern auch alle Fehler ab. Fehler werden von der JVM ausgelöst, um auf schwerwiegende Probleme hinzuweisen, die nicht von einer Anwendung behandelt werden sollen. Typische Beispiele hierfür sind der OutOfMemoryError oder der StackOverflowError. Beide werden durch Situationen verursacht, die außerhalb der Kontrolle der Anwendung liegen und nicht behandelt werden können. Sie sollten also keine Throwables abfangen, es sei denn, Sie sind sich sicher, dass es sich nur um eine Ausnahme handelt, die sich innerhalb der Throwable befindet.

0voto

VicXj Punkte 107

Wenn wir die throwable dann umfasst sie エラー und das war's dann auch schon.

Beispiel.

    public class ExceptionTest {
/**
 * @param args
 */
public static void m1() {
    int i = 10;
    int j = 0;
    try {
        int k = i / j;
        System.out.println(k);
    } catch (Throwable th) {
        th.printStackTrace();
    }
}

public static void main(String[] args) {
    m1();
}

}

Ausgabe:

java.lang.ArithmeticException: / by zero
at com.infy.test.ExceptionTest.m1(ExceptionTest.java:12)
at com.infy.test.ExceptionTest.main(ExceptionTest.java:25)

0voto

TwoThe Punkte 13319

Eine differenziertere Antwort wäre: Es kommt darauf an.

Der Unterschied zwischen einer Ausnahme und einem Fehler besteht darin, dass eine Ausnahme ein Zustand ist, der erwartet werden muss, während ein Fehler ein unerwarteter Zustand ist, der in der Regel fatal ist. Fehler können in der Regel nicht behoben werden und erfordern das Zurücksetzen großer Teile des Programms oder sogar der gesamten JVM.

Das Auffangen von Ausnahmen ist etwas, das Sie immer tun sollten, um Zustände zu behandeln, die wahrscheinlich auftreten werden, weshalb es von der JVM erzwungen wird. D.h. das Öffnen einer Datei kann eine FileNotFoundException verursachen, der Aufruf einer Web-Ressource kann zu einer TimeoutException führen, und so weiter. Ihr Code muss darauf vorbereitet sein, mit diesen Situationen umzugehen, da sie sehr häufig auftreten können. Wie Sie damit umgehen, bleibt Ihnen überlassen, es ist nicht notwendig, sich von allem zu erholen, aber Ihre Anwendung sollte nicht zurück zum Desktop booten, nur weil ein Webserver etwas länger gebraucht hat, um zu antworten.

Das Auffangen von Fehlern sollten Sie nur dann tun, wenn es wirklich notwendig ist. Im Allgemeinen können Sie Fehler nicht beheben und sollten dies auch nicht versuchen, es sei denn, Sie haben einen guten Grund dazu. Gründe für das Abfangen von Fehlern sind das Schließen kritischer Ressourcen, die sonst offen bleiben würden, oder wenn Sie z.B. einen Server haben, auf dem Plugins laufen, die dann das Plugin, das den Fehler verursacht hat, stoppen oder neu starten können. Andere Gründe sind, zusätzliche Informationen zu protokollieren, die später bei der Fehlersuche helfen könnten. In diesem Fall sollten Sie den Fehler natürlich erneut auslösen, um sicherzustellen, dass die Anwendung ordnungsgemäß beendet wird.

Faustformel: Es sei denn, Sie haben einen wichtigen Grund, Errors zu fangen, dann lassen Sie es.

Verwenden Sie daher catch (Throwable t) nur in solchen wirklich wichtigen Situationen, ansonsten bleiben Sie bei catch (Exception e)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X