2011-01-29 98 views
0

我需要执行一些初始化并在发生任何异常时进行清理。我仍然喜欢将异常传递给调用者。问题是我现在必须将这个方法声明为throws Throwable,然后我必须在调用者中明确地处理这个throwable,就好像所有的过程都不隐含地抛出Throwable一样。愚蠢是不是?这样做的执行清理并将异常传递给调用者


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

回答

1

一种方法是在执行清理finally块来代替,注意是否有被你是否真的到了try块的结束或也不例外:

boolean success = false; 
try { 
    // Stuff here 
    success = true; 
} finally { 
    if (!success) { 
     clean(); 
    } 
} 
0

愚蠢的是打击检查异常。如果你不想要求每个调用者来处理它,你必须抛出一些不同的东西。只是抛出一个RuntimeException

public void myMethod() throws RuntimeException { 
    try { 
     init_step1(); 
     init_step2(); 
    } 
    catch (Throwable th) { 
     clean(); 
     throw new RuntimeException(th); 
    } 
} 

为什么你赶上第一个地方反正呢? init_step1()和init_step2()不会引发异常?

+0

init_step1()和init_step2()可能会抛出一个Throwable,我必须确保数据的一致性。我希望调用者只处理检查的异常。这就是为什么他们称他们为“检查”,不是吗? – milan 2011-01-29 08:59:49

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); 
} 
相关问题