例外没有“原因”参数

时间:2017-02-28 15:56:47

标签: java exception-handling

许多内置的Java异常无法接受"cause"。有没有办法为这些例外分配原因?

我希望能够链接异常,例如InterruptedException示例:

try{
    //threaded code
}catch (InterruptedException e){
    throw new InterruptedException("context-specific information", e);
}

如果这样的构造函数不存在,那么推理是什么?

编辑:我考虑过抛出一个接受cause参数的异常或运行时异常。我没有选择其中任何一个选项的原因是因为我在一个期望InterruptedException的框架内工作,而不是其他一些异常类型。

2 个答案:

答案 0 :(得分:5)

异常类错过附加原因的方法的逻辑原因是他们不能将另一个异常作为原因。

以例外情况为例,我们获得了export("Galactica',") export(Battlestar) InterruptedException。这些都不会导致异常,因为UnsupportedAudioFileException因其他异常而无法发生,但仅在线程被中断时才会出现。

另一方面,

InterruptedException可能会有原因,但它会毫无用处。没有"更深层次"不支持音频文件的原因。

因此UnsupportedAudioFileException也没有成功的原因并不令人惊讶。这并不是因为有很多原因可以实现......

如果您正在使用未在构造函数中执行包装异常的异常,那么您可能正在使用未针对此类用途设计的异常。虽然现成的"一般例外"比如NullPointerException确实包含(甚至期望)原因,如果找不到适合您用例的现有原因,请创建自己的例外。

如果您正在使用期望IllegalArgumentException的框架,则有两种可能性。要么选择它是因为名称("嘿,停止这个工作应该抛出InterruptedException")或者它是因为理智的设计选择而被选中的。您应该首先确保您没有使用错误的框架,因为InterruptedException不是一般用例异常并且意味着中断的线程。

答案 1 :(得分:0)

  

有没有办法为这些例外分配原因?

是;您可以使用the initCause(Throwable) method,它允许设置原因。它只能为给定的异常实例调用一次;它特别针对这种情况。

  

如果这样的构造函数不存在,那么推理是什么?

奇怪的是,尽管绝大多数JDK例外确实支持采用原因,但the Javadoc for java.lang.Throwable似乎暗示不是预期的默认值。 Javadoc描述了一些您可能想要包装异常的原因(在您的情况下都不适用:它们都与在不同类型的异常中包装一种类型的异常有关),并且它说明原因 - 接受构造函数应仅为“希望允许原因与它们相关联的可抛出类”创建,或者甚至仅为“可能可能与其相关的原因的子类”创建(强调我的)。

我想知道JDK是否落后于时代;显然原因原本并不像我们现在所期望的那样普遍使用?