Ich schreibe einige JUnit-Tests, die überprüfen, dass eine Ausnahme vom Typ MyCustomException
ausgelöst wird. Diese Ausnahme wird jedoch einige Male in andere Ausnahmen eingeschlossen, z. in einer InvocationTargetException, die wiederum in eine RuntimeException eingeschlossen ist.Die beste Möglichkeit, um zu überprüfen, ob ein bestimmter Ausnahmetyp in einer verschachtelten Ausnahme die Ursache (einer Ursache usw.) war?
Was ist der beste Weg zu bestimmen, ob MyCustomException irgendwie die Ausnahme verursachte, die ich tatsächlich erwische? Ich möchte so etwas tun (siehe unterstrichene):
try { doSomethingPotentiallyExceptional(); fail("Expected an exception."); } catch (RuntimeException e) { if (!e.
wasCausedBy(MyCustomException.class) fail("Expected a different kind of exception."); }
Ich möchte getCause()
ein paar „Schichten“ tief und ähnliche hässliche Umgehungen vermeiden, fordern. Gibt es einen schöneren Weg?
(Offenbar Frühling NestedRuntimeException.contains(Class) hat, das tut, was ich will - aber ich bin mit Spring nicht.)
GESCHLOSSEN: OK, ich denke, es gibt wirklich keinen um eine Hilfsmethode bekommen :-) Danke an alle, die geantwortet haben!
Beachten Sie, dass dieser Algorithmus eine unendliche Schleife verursachen kann, wenn die Ursache eine Schleife hat, die passieren kann, einige Fälle wie EclipseLink DB Ausnahmen. [Apache Commons Lang ExceptionUtils :: getRootCause] (https://commons.apache.org/proper/common-lang/javadocs/api-3.1/org/apache/commons/lang3/exception/ExceptionUtils.html#getRootCause (Java. lang.Throwable)) handhabt diesen Fall, also wahrscheinlich auch 'indexOfThrowable' aus Patricks Antwort. – DavidS
@DavidS Keine Endlosschleife - es würde schnell "StackOverflowError" werfen. Wenn Sie einen solchen Kausalzusammenbruch haben, dann haben Sie größere Probleme (wahrscheinlich versuchen Sie, Ausnahmeobjekte wiederzuverwenden, obwohl sie seltsam veränderbar sind). –
Ein StackOverflowError dann, danke. Egal, das ist kein Problem mit Code, den ich geschrieben habe; Es ist ein Problem in einigen allgemeinen Bibliotheken, einschließlich einiger Oracle jdbc-Treiber. Es ist ein häufig genug auftretendes Problem, dass Apache Commons es in 'getRootCause' gehandhabt hat, Oracle entschied sich dafür, es in [printStackTrace] (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6962571) und Guava zu handhaben überlegt, es in [Throwables] zu behandeln (https://github.com/google/guava/issues/1173). Mein Kommentar sollte davor warnen, nicht empfehlen, wie man Exceptions am besten baut. – DavidS