JDK 1.7 Throwable `addSuppressed ()` - Methode
Gut, ich bekomme über Fragen, ich Lesen Sie den source-code von JDK 1.7, aber ich finde nicht die Antwort.
In dieser Frage möchte ich komplett ignorieren fillInStackTrace
.
Ab JDK 1.4 initCause()
Methode wurde Hinzugefügt. Zum Beispiel, wenn Sie Kern-Reflexion die Methode aufzurufen, die Sie erhält, InvocationTargetException mit der Ursache, die Ziel-Ausnahme in es.
Als ich sah, diese Funktion, die ich begann, es zu benutzen auch in ein Szenario wie dieses
try {
//contains some code that can throw new IOException();
}
catch(IOException e){
throw new RuntimeException(e);
}
So, ich fange eine Ausnahme, ich bin nicht bereit mit ihm zu beschäftigen und mich hier rethrow neue Ausnahme, wo ich ursprüngliche Ausnahme als die Ursache. In einigen scenarious keine RuntimeException, sondern meine eigene exception verwendet wird, also manchmal rufe ich auch an e.getCause()
um richtig zu behandeln diese Ausnahme im äußeren block.
Dies ist der Fall im pre-JDK 1.7. Warum und Wann sollte ich addSuppressed()
? Muss ich den code oben, um
try {
//contains some code that can throw new IOException();
}
catch(IOException e){
RuntimeException re= new RuntimeException(e.getMessage());
re.addSuppressed(e);
throw re;
}
Und als bonus-Frage, warum nicht addSuppressed()
zurück Throwable
als initCause()
tut, um zu ermöglichen throw (RuntimeException)new RuntimeException().initCause(e);
? Zum Beispiel, warum kann ich das nicht?:
try {
//contains some code that can throw new IOException();
}
catch(IOException e){
throw (RuntimeException)new RuntimeException(e.getMessage()).addSuppressed(e);
}
Ich extrahiert die Antwort auf einen eigenen post.
- was haben Sie nicht verstehen, aus der javadoc der Methode in Frage? ich hatte noch nie gesehen, die
addSuppressed()
- Methode vor, aber eine schnelle Lesen der javadoc-deutlich gemacht, was sein Zweck ist. (Tipp, in Ihrem Beispiel verwenden Sie Fällen würde es keinen Sinn machen). - Gut, javadoc-war das nicht genug. Warum downvote die Frage?
- warum war es nicht genug, was haben Sie nicht verstanden?
- Ich fand das stackoverflow.com/questions/7860137/... wie sehr klare Erklärung, wie try-mit-Ressourcen-Funktion tatsächlich umgesetzt wird.
- lassen Sie die Stimmen entscheiden über die Nützlichkeit dieser Frage und Antwort. Nur zur Erinnerung : blog.stackoverflow.com/2011/07/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen, Throwable
addSuppressed()
Methode sollte verwendet werden, wenn in gewisser Weise haben wir parallel Ausführung die Ausnahme, dass dort, wo unterdrückt. Ich fand 2 Beispiele;Try-mit-Ressourcen-block (try-finally-block), wenn der aufrufende code die original-exception im try-oder catch-block) und der Ausnahme, dass es in den finally-block.
batch-jobs (bulk operations) Wann sollten wir zum nächsten Element überzugehen, unabhängig davon, ob die operation auf das aktuelle Element erfolgreich war oder nicht
Bevor man an die details, wie @sarelbotha angegeben, in meinem Fall habe ich einfach nur zu halten, wickeln Sie die ursprüngliche Ausnahme als die Ursache für meine neue Ausnahme.
Default-Verhalten in try-finally-block, wo wir 2 Ausnahmen, die die ursprüngliche Ausnahme ist unterdrückt und wir sehen nur die Ausnahme von finally-block. Wenn wir finally-block auf, um zu schließen Sie die Ressourcen, als wir wirklich sehen wollen, der die ursprüngliche Ausnahme, aber auch wir sehen wollen, auch Ausnahmen von der finally-block geschlossen, dass unser Ressourcen-und scheitert.
http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#printStackTrace%28%29
Ersten man Lesen sollte, über die try-mit-Ressourcen-neue Funktion. Sie können es hier Lesen http://www.baptiste-wicht.com/2010/08/java-7-try-with-resources-statement/ zum Beispiel oder hier Was ist die Java 7 try-mit-Ressourcen, die das bytecode-äquivalent Einsatz von try-catch-finally?. Kurz gesagt, Sie können 2 Throwable parallel in gewissem Sinne, in der Regel aus, die Sie versuchen, zu blockieren und von Ihrem finally-block. Eine alte try-catch-semantischen zurück Ausnahme von der finally-block whule unterdrückt Ausnahme aus der try-block (oder erneute auslösen Ausnahme von der catch-block). Eine neue try-with-resource-Funktion ermöglicht es Ihnen, sowohl als Ausnahme. Noch mehr, erhalten Sie die ursprüngliche Ausnahme, wo die Ausnahme von der finally-block wird unterdrückt
Beispiel:
}
Ausgabe wird folgende sein:
batch-jobs (bulk operations).
Nun, ich fand einige Nutzung dieser Methode außerhalb von try-mit-Ressourcen. Unten ist source code von der
java.net.URLClassLoader.close
Im Allgemeinen kann ein solcher Ansatz kann verwendet werden, in batch-jobs (bulk operations), wenn wir gehen, um das nächste Element (Schließung nächsten öffnen von streams, wie in diesem Beispiel) unabhängig davon, ob die operation auf das aktuelle Element erfolgreich war oder nicht. So, wir haben, wie gesagt, in gewisser Weise parallel Ausführung die Ausnahme, dass dort, wo unterdrückt. In solchen Fällen sollten wir den Ansatz oben zu werfen, mit Ausnahme verbleibenden unterdrückt Ausnahme in es.
Unterdrückt Ausnahmen gespeichert werden, wenn die code-Ausführung in einem finally-block eine exception wirft. Es ist eine Ausnahme, die passiert ist, dass Sie wahrscheinlich nicht kümmern. In Java 6, eine solche Ausnahme im finally-block werden würde, die einzige Ausnahme ist Ihre Berufung-code sehen würde, aber mit dem neuen try-with-resource block den aufrufenden code sehen würde, der die ursprüngliche Ausnahme, und die Ausnahme, das passiert in der virtuellen finally-block wäre in getSuppressed().
In Ihrem Fall, nur halten Sie das einwickeln der ursprüngliche exception als Ursache des neuen Ausnahme.
try-with-resource
neues feature von JDK 1.7. Angefangen, darüber zu Lesen. Danke.printStackTrace()
Methode docs.oracle.com/javase/7/docs/api/java/lang/... ? Ich bin nicht interessant in dem stack-trace Zeug jetzt. Für mich gibt es keine Verbindung zwischen den Fragen.