我需要做一些初始化并在发生任何异常时将其清理干净。我仍然希望将异常传递给调用者。问题是我现在必须将此方法声明为throws Throwable
,然后我必须在调用者中显式处理此throwable,就好像所有过程都不会隐式抛出Throwable
一样。愚蠢不是吗?
try {
init_step1();
init_step2();
}
catch (Throwable th) {
clean();
throw th;
}
答案 0 :(得分:1)
这样做的一种方法是在finally块中执行清理,注意是否实际到达try块的末尾是否存在异常:
boolean success = false;
try {
// Stuff here
success = true;
} finally {
if (!success) {
clean();
}
}
答案 1 :(得分:0)
Stupid正在与已检查的例外作斗争。如果您不想要求每个调用者都能处理它,您必须抛出不同的东西。只是抛出一个RuntimeException
public void myMethod() throws RuntimeException {
try {
init_step1();
init_step2();
}
catch (Throwable th) {
clean();
throw new RuntimeException(th);
}
}
为什么你最初会抓住Throwable? init_step1()和init_step2()不会抛出异常吗?
答案 2 :(得分:0)
@Jon Skeet的解决方案是最干净的。您可能感兴趣的另一种解决方案。
try {
// Stuff here
} catch(Throwable t) {
clean(t);
// bypasses the compiler check
Thread.currentThread().stop(t);
}
如果您需要知道引发的异常,我建议您使用此方法。例如对于我可以关闭的资源,我记录触发它们关闭的异常。这样,如果我尝试使用该资源并且它已关闭,我可以看到它为何被关闭。
private void checkClosed() {
if (closed)
throw new IllegalStateException("Closed", reasonClosed);
}