我可以创建一个异常吗
A a = new A (new B ( new A ) );
其中A
和B
是两种不同类型的异常。
我知道 Java 可以做到这一点,但是这样做正确吗?
编辑:我正在编写异常类型的重试,因此我正在检查异常的 getCause。当 getCause 为 null 或 getCause 等于自身时我会中断,当 getCause 等于迄今为止看到的任何异常时我是否也应该中断
最佳答案
AException a = new AException (new BException ( new AException ) );
这是合法的。
<小时/>您还可以使用 initCause(Throwable)
方法直接初始化原因。
如果你试图让异常成为其自身的原因;例如
AException a = new AException();
a.initCause(a);
您将得到一个IllegalArgumentException(“不允许 self 因果关系”)
。 (感谢 Joachim Sauer 指出了这一点。)
尽管 JVM 不会阻止您创建间接循环,但这仍然是一个非常糟糕的主意。
这是对
Throwable
API 的滥用。直接或间接导致的异常事件在逻辑上是没有意义的。可能有代码假设异常的“原因”链没有任何循环。如果此类代码遇到具有原因循环的病态异常,则可能会以令人讨厌的方式失败。
请注意,当前一代(Java 7)printStackTrace()
检测并处理“原因”循环,但早期版本没有:
关于java - 我们可以在java中用它自己的异常来包装异常吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12701789/