异常没有"原因"参数

Gla*_*lef 0 java exception-handling

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

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

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

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


编辑:我考虑过抛出一个接受cause参数的异常或运行时异常.我没有使用这两个选项的原因是因为我在一个需要一个InterruptedException而不是其他异常类型的框架内工作.

Kay*_*man 5

缺少附加原因的方法的异常类的逻辑原因是它们不能将另一个异常作为原因.

以作为例子给出的例外,我们有InterruptedException和UnsupportedAudioFileException.这些都不会将异常作为原因,因为InterruptedException由于其他异常而无法发生,但仅在线程被中断时才会发生.

UnsupportedAudioFileException另一方面可能会有原因,但这将是无用的.音频文件不受支持没有"更深层次"的原因.

因此,没有任何NullPointerException理由并不令人惊讶.这并不是说有很多原因要发生......

如果您正在使用不在构造函数中包含异常的异常,那么您可能正在使用不是为此类用途而设计的异常.虽然现成的"常规异常"就像IllegalArgumentException包含(甚至预期)原因一样,如果找不到适合您用例的现有异常,请创建自己的异常.

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

  • 我写的是一个非常相似的答案.然后我挑战自己找到一个过于抽象而不能单独存在的异常,但没有`cause`参数.[DestroyFailedException](https://docs.oracle.com/javase/7/docs/api/javax/security/auth/DestroyFailedException.html).不是说你的答案是错的,+ 1,但我很想听听人们对这个例外的看法. (3认同)