bn.*_*bn. 4 java design-patterns exception-handling
是否有理由要这样做:
void foo() throws Exception
{
// Do something potentially exceptional
}
Run Code Online (Sandbox Code Playgroud)
而不是抛出现有的或自定义的异常?
我可以想到两种情况 - 我能想到的第一个类似的情况是在实施时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并不是那么糟糕 - 它仍然非常不明确,但至少不会强迫调用者明确地捕获所有内容.