2011-01-29 99 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); 
} 
相關問題