Beste Weg, um zu überprüfen, ob ein bestimmter exception-Typ war die Ursache (der Ursache, etc ...) in eine geschachtelte Ausnahme?
Schreibe ich einige JUnit-tests, die überprüfen, ob eine Ausnahme des Typs MyCustomException
geworfen wird. Aber diese Ausnahme ist eingewickelt in anderen Ausnahmen, die eine Anzahl von Zeiten, z.B. in eine InvocationTargetException, die wiederum verpackt in eine RuntimeException.
Was ist der beste Weg, um zu bestimmen, ob MyCustomException irgendwie die Ausnahme verursacht hat, die ich eigentlich fangen? Ich möchte so etwas wie dies tun (siehe Unterstrichen):
try { doSomethingPotentiallyExceptional(); fail("Expected an exception."); } catch (RuntimeException e) { if (!e.
wasCausedBy(MyCustomException.class) fail("Expected a different kind of exception."); }
Ich würde gerne vermeiden, fordern getCause()
ein paar "Ebenen" tief, und ähnlich hässlichen Workarounds. Gibt es einen schöneren Weg?
(Offenbar, der Frühling hat NestedRuntimeException.enthält(Klasse)die tut, was ich will - aber ich bin nicht mit Spring.)
GESCHLOSSEN:
OK, ich denke, es ist wirklich kein Weg um eine utility-Methode 🙂 vielen Dank an alle die geantwortet!
InformationsquelleAutor der Frage Yang Meyer | 2009-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum würden Sie wollen, um zu vermeiden
getCause
. Sie können natürlich auch selbst schreiben, eine Methode, um die Aufgabe zu erfüllen, so etwas wie:InformationsquelleAutor der Antwort Tom Hawtin - tackline
Wenn Sie Apache Commons Langdann können Sie die folgenden verwenden:
(1) Wenn die Ursache sollte genau den angegebenen Typ
(2) Wenn die Ursache sollte entweder den angegebenen Typ oder seiner Unterklasse Typ
InformationsquelleAutor der Antwort Patrick Boos
Ich glaube nicht, dass Sie keine Wahl haben, aber zu nennen, durch die Schichten der getCause. Wenn man sich den Quellcode für das Frühjahr NestedRuntimeException, den Sie erwähnen, ist, wie es umgesetzt wird.
InformationsquelleAutor der Antwort Mark
Nachahmung ist die aufrichtigste form der Schmeichelei. Basierend auf einer schnellen Inspektion der Quelledas ist genau das, was NestedRuntimeException:
VORBEHALT: Das oben ist der code, der als vom 4. März 2009, so, wenn Sie wirklich wollen, zu wissen, was im Frühjahr ist, jetzt tun, Sie sollten die Forschung der code, wie es heute existiert (Wann immer das ist).
InformationsquelleAutor der Antwort Bob Cross
Gut, ich denke, es gibt keinen Weg, dies zu tun, ohne
getCause()
. Es Sie denken, es ist hässlich Umsetzung einer utility Klasse, dies zu tun:InformationsquelleAutor der Antwort bruno conde
Können Sie dies mit Guave:
InformationsquelleAutor der Antwort emannuelbs
Basierend auf Patrick Boos Antwort:
Wenn Sie mithilfe von Apache Commons Lang 3 Sie prüfen können:
indexOfThrowable: liefert die (null-basiert) index des ersten Throwable, die der angegebenen Klasse (genau) in der exception-chain. Unterklassen von der Klasse nicht überein
oder
indexOfType: liefert die (null-basiert) index des ersten Throwable, entspricht die angegebene Klasse oder Unterklasse in der exception-chain. Unterklassen der angegebenen Klasse übereinstimmen
Beispiel für mehrere Typen mit Java-8:
InformationsquelleAutor der Antwort Nagy Attila