执行清理并将异常传递给调用者

时间:2011-01-29 08:47:01

标签: java exception-handling

我需要做一些初始化并在发生任何异常时将其清理干净。我仍然希望将异常传递给调用者。问题是我现在必须将此方法声明为throws Throwable,然后我必须在调用者中显式处理此throwable,就好像所有过程都不会隐式抛出Throwable一样。愚蠢不是吗?


try {
  init_step1();
  init_step2();
}
catch (Throwable th) {
  clean();
  throw th;
}

3 个答案:

答案 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);
}