Java:抛出异常而不是特定异常的原因是什么?

bn.*_*bn. 4 java design-patterns exception-handling

是否有理由要这样做:

void foo() throws Exception
{
    // Do something potentially exceptional
}
Run Code Online (Sandbox Code Playgroud)

而不是抛出现有的或自定义的异常?

Mic*_*rry 5

我可以想到两种情况 - 我能想到的第一个类似的情况是在实施时finalize(),你必须抛出Throwable:

@Override
protected void finalize() throws Throwable {
    super.finalize();
}
Run Code Online (Sandbox Code Playgroud)

...虽然记住一些人认为使用finalize本身应该是不鼓励的.

可能的第二种情况是使用(编写得很糟)的库,其方法可能会抛出一个Exception,在这种情况下如果你不想在那个特定的方法中处理它,你唯一的选择就是把它扔到堆栈上.

就个人而言,如果那是我,我很可能将它包装在RuntimeException中然后在那里:

public void doSomething() {
    try {
        int x = libraryThing.badMethod(); //Library method that throws "Exception"
    }
    catch(Exception ex) {
        throw new RuntimeException("Couldn't do something", ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

RuntimeException在这种情况下,构造函数的第二个参数很重要,因为如果抛出它会将堆栈跟踪上的原始异常保留为("由:x引起").当然,如果你能找到一个更具体的RuntimeException子类,你可以保证在该上下文中是相关的(IllegalArgumentException例如),那么使用它会更好.

然而,就普通代码而言,没有 - 我认为它几乎总是一种反模式(通常只是因为懒惰造成的!)

作为一个侧面点,抛出一个RuntimeException并不是那么糟糕 - 它仍然非常不明确,但至少不会强迫调用者明确地捕获所有内容.