Piszę niektóre testy JUnit, które sprawdzają, czy zgłoszony został wyjątek typu MyCustomException
. Jednak ten wyjątek jest wielokrotnie zawijany w innych wyjątkach, np. w wyjątku InvocationTargetException, który z kolei jest zawijany w wyjątek RuntimeException.Najlepszy sposób sprawdzenia, czy określony wyjątek był przyczyną (przyczyny, itp.) W zagnieżdżonym wyjątku?
Jaki jest najlepszy sposób ustalenia, czy MyCustomException w jakiś sposób spowodował wyjątek, który faktycznie złapałem? Chciałbym zrobić coś takiego (patrz podkreślone):
try { doSomethingPotentiallyExceptional(); fail("Expected an exception."); } catch (RuntimeException e) { if (!e.
wasCausedBy(MyCustomException.class) fail("Expected a different kind of exception."); }
Chciałbym uniknąć wywoływania getCause()
kilka „warstw” głębokie i podobnych brzydkie obejścia. Czy jest lepszy sposób?
(Najwyraźniej wiosna NestedRuntimeException.contains(Class), który robi to, co chcę - ale nie używam Wiosna.)
zamknięty: OK, myślę, że naprawdę nie ma sposobu poruszania użytkowego :-) Dziękuję wszystkim, którzy odpowiedzieli!
Zauważ, że ten algorytm może spowodować nieskończoną pętlę jeśli przyczyna ma pętlę, która może się zdarzyć niektóre przypadki, takie jak wyjątki EclipseLink DB. [Apache Commons Lang ExceptionUtils :: getRootCause] (https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/exception/ExceptionUtils.html#getRootCause (java. lang.Throwable)) obsługuje ten przypadek, więc prawdopodobnie 'indexOfThrowable' z odpowiedzi Patricka również. – DavidS
@DavidS Nie jest to nieskończona pętla - wystarczy rzucić 'StackOverflowError'. Jeśli masz taki związek przyczynowy, masz większe problemy (prawdopodobnie próbujesz ponownie użyć wyjątków, mimo że są dziwnie zmienne). –
A StackOverflowError następnie, dzięki. Bez względu na to, nie jest to problem z kodem, który napisałem; jest to problem w niektórych popularnych bibliotekach, w tym niektórych sterownikach jdbc Oracle. Jest to dość powszechny problem, który Apache Commons zdecydował się obsłużyć w 'getRootCause', Oracle zdecydował się obsłużyć go w [printStackTrace] (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6962571) i Guava za rozpatrzenie go w [Throwables] (https://github.com/google/guava/issues/1173). Mój komentarz miał na celu ostrzec o tym, nie polecam, jak najlepiej konstruować Wyjątki. – DavidS