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?

13voto

DNA Punkte 40967

Catching Throwable ist manchmal notwendig, wenn Sie Bibliotheken verwenden, die Fehler übermäßig enthusiastisch werfen, sonst kann Ihre Bibliothek Ihre Anwendung beenden.

Unter diesen Umständen wäre es jedoch am besten, nur die spezifischen Fehler anzugeben, die von der Bibliothek ausgelöst werden, und nicht alle Throwables.

8voto

Garret Wilson Punkte 15709

Die Frage ist etwas vage; fragen Sie: "Ist es in Ordnung, die Throwable ", oder "ist es OK, einen Throwable und nichts zu tun"? Viele Leute hier haben letzteres geantwortet, aber das ist eine Nebensache; in 99 % der Fälle sollte man die Ausnahme nicht "verbrauchen" oder wegwerfen, egal ob man sie fängt Throwable o IOException oder was auch immer.

Wenn Sie die Ausnahme propagieren, lautet die Antwort (wie die Antwort auf so viele Fragen) "es kommt darauf an". Es hängt davon ab, was Sie mit der Ausnahme machen - warum Sie sie abfangen.

Ein gutes Beispiel dafür, warum Sie sich fangen sollten Throwable ist es, im Falle eines Fehlers eine Art Bereinigung vorzunehmen. Wenn beispielsweise bei JDBC während einer Transaktion ein Fehler auftritt, möchten Sie die Transaktion zurücksetzen:

try {
  …
} catch(final Throwable throwable) {
  connection.rollback();
  throw throwable;
}

Beachten Sie, dass die Ausnahme nicht verworfen, sondern weitergegeben wird.

Generell gilt jedoch, dass der Fang von Throwable weil man keinen Grund hat und zu faul ist, nachzuschauen, welche spezifischen Ausnahmen ausgelöst werden, ist eine schlechte Form und eine schlechte Idee.

6voto

ic3 Punkte 7409

Throwable ist die Basisklasse für alle Klassen, die ausgelöst werden können (nicht nur Ausnahmen). Es gibt wenig, was Sie tun können, wenn Sie einen OutOfMemoryError oder KernelError abfangen (siehe Wann sollte java.lang.Error abgefangen werden? )

Das Abfangen von Ausnahmen sollte ausreichen.

5voto

b.buchhold Punkte 3807

Es hängt von Ihrer Logik ab oder, um genauer zu sein, von Ihren Optionen/Möglichkeiten. Wenn es eine bestimmte Ausnahme gibt, auf die Sie möglicherweise sinnvoll reagieren können, könnten Sie sie zuerst abfangen und dies tun.

Wenn dies nicht der Fall ist und Sie sicher sind, dass Sie bei allen Ausnahmen und Fehlern das Gleiche tun werden (z. B. mit einer Fehlermeldung beenden), ist es kein Problem, das Throwable zu fangen.

In der Regel trifft der erste Fall zu, und Sie würden den Wurfgegenstand nicht fangen. Aber es gibt immer noch viele Fälle, in denen das Fangen gut funktioniert.

4voto

Alireza Fattahi Punkte 37703

Obwohl dies als sehr schlechte Praxis bezeichnet wird, kann man manchmal feststellen selten Fälle, in denen es nicht nur nützlich, sondern auch obligatorisch ist. Hier sind zwei Beispiele.

In einer Webanwendung, in der Sie dem Benutzer eine aussagekräftige Fehlerseite anzeigen müssen. Dieser Code stellt sicher, dass dies geschieht, denn es ist eine große try/catch um alle Ihre Request-Handler (Servlets, Struts-Actions oder jeden Controller ....)

try{
     //run the code which handles user request.
   }catch(Throwable ex){
   LOG.error("Exception was thrown: {}", ex);
     //redirect request to a error page. 
 }

}

Ein weiteres Beispiel: Sie haben eine Serviceklasse, die für den Geldtransfer zuständig ist. Diese Methode gibt eine TransferReceipt wenn die Übertragung erfolgt ist oder NULL wenn sie es nicht könnte.

String FoundtransferService.doTransfer( fundtransferVO);

Jetzt erhalten Sie eine Abbildung List von Geldüberweisungen vom Benutzer und Sie müssen den oben genannten Dienst nutzen, um sie alle zu erledigen.

for(FundTransferVO fundTransferVO : fundTransferVOList){
   FoundtransferService.doTransfer( foundtransferVO);
}

Aber was wird passieren, wenn jede Ausnahme passiert? Sie sollten nicht aufhören, da eine Übertragung erfolgreich gewesen sein kann und eine nicht, Sie sollten weiter durch alle Benutzer gehen List und zeigen Sie das Ergebnis bei jeder Übertragung. Am Ende erhalten Sie also diesen Code.

for(FundTransferVO fundTransferVO : fundTransferVOList){
    FoundtransferService.doTransfer( foundtransferVO);
 }catch(Throwable ex){
    LOG.error("The transfer for {} failed due the error {}", foundtransferVO, ex);
  }
}

Sie können viele Open-Source-Projekte durchsuchen, um zu sehen, dass die throwable wirklich zwischengespeichert und bearbeitet wird. Hier ist zum Beispiel eine Suche nach tomcat , struts2 y primefaces :

https://github.com/apache/tomcat/search?utf8=%E2%9C%93&q=catch%28Throwable https://github.com/apache/struts/search?utf8=%E2%9C%93&q=catch%28Throwable https://github.com/primefaces/primefaces/search?utf8=%E2%9C%93&q=catch%28Throwable

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