Tôi đang viết một số kiểm tra JUnit xác minh rằng ngoại lệ loại MyCustomException
được ném. Tuy nhiên, ngoại lệ này được bao bọc trong các trường hợp ngoại lệ khác một số lần, ví dụ: trong một InvocationTargetException, mà lần lượt được bọc trong một RuntimeException.Cách tốt nhất để kiểm tra xem một loại ngoại lệ nhất định có phải là nguyên nhân (của một nguyên nhân, v.v.) trong một ngoại lệ lồng nhau không?
Cách tốt nhất để xác định xem MyCustomException bằng cách nào đó có gây ra ngoại lệ mà tôi thực sự bắt không? Tôi muốn làm điều gì đó như thế này (xem gạch chân):
try { doSomethingPotentiallyExceptional(); fail("Expected an exception."); } catch (RuntimeException e) { if (!e.
wasCausedBy(MyCustomException.class) fail("Expected a different kind of exception."); }
Tôi muốn tránh gọi getCause()
một vài "lớp" sâu, và tương tự như xấu xí công việc ở quanh. Có cách nào đẹp hơn không?
(Rõ ràng, mùa xuân có NestedRuntimeException.contains(Class), mà làm những gì tôi muốn - nhưng tôi không sử dụng Spring.)
CLOSED: OK, tôi đoán có thực sự không nhận được xung quanh một phương pháp hữu ích :-) Cảm ơn tất cả mọi người đã trả lời!
Lưu ý rằng thuật toán này có thể gây ra một vòng lặp vô hạn nếu nguyên nhân có một vòng lặp, có thể xảy ra trong một số trường hợp ngoại lệ như 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)) xử lý trường hợp này, vì vậy có lẽ 'indexOfThrowable' từ câu trả lời của Patrick cũng vậy. – DavidS
@DavidS Không phải là vòng lặp vô hạn - nó sẽ nhanh chóng ném 'StackOverflowError'. Nếu bạn đã có một sự cố trong quan hệ nhân quả như thế thì bạn đã có những vấn đề lớn hơn (có thể cố gắng sử dụng lại các đối tượng ngoại lệ mặc dù chúng có thể thay đổi một cách kỳ lạ). –
Một StackOverflowError sau đó, cảm ơn. Bất kể, đây không phải là vấn đề với mã tôi đã viết; đó là một vấn đề trong một số thư viện phổ biến, bao gồm một số trình điều khiển JDBC Oracle. Đó là một vấn đề đủ phổ biến mà Apache Commons đã chọn để xử lý nó trong 'getRootCause', Oracle đã chọn xử lý nó trong [printStackTrace] (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6962571) và Guava xem xét xử lý nó trong [Throwables] (https://github.com/google/guava/issues/1173). Nhận xét của tôi được dự định để cảnh báo về điều này, không khuyên bạn nên xây dựng Ngoại lệ tốt nhất. – DavidS