2011-09-27 53 views
9

我嘗試過幾種不同的捕捉方式。我有一些「清理」代碼,只有在拋出異常時才應該運行。我可以爲每個異常添加相同的代碼,但這會成爲維護噩夢。基本上,我想要像finally語句那樣的東西,但它只能在拋出異常時才運行。如何僅在拋出異常時才使代碼運行?

這可能嗎?

+0

是您遇到的這些運行時錯誤還是您自己的業務錯誤。 – Shahzeb

+0

IOException,ClientProtocolException,UnsupportedEncodingException等 – Bromide

回答

18

不幸的是沒有直接的支持。這樣的事情如何

boolean successful = false; 
try { 
    // do stuff 
    successful = true; 
} catch (...) { 
    ... 
} finally { 
    if (!successful) { 
     // cleanup 
    } 
} 
1

我能想到的唯一的事情是在每個捕獲設置一個變量,然後在最後檢查該變量。

僞代碼:

Boolean caught = false; 

try { 

    //risky code here 

catch(err) { 
    caught = true; 
    // Do other stuff 
} 
catch(err) { 
    caught = true; 
    // Do other stuff 
} 
catch(err) { 
    caught = true; 
    // Do other stuff 
} 
finally { 
    if (caught) { 
     // Do clean up 
    } 

} 
0

你爲什麼不只是用簡單的嘗試&收穫?

try 
{ 
    foo(); 
} 
catch(Exception1 e1) 
{ 
    dealWithError(1); 
} 
catch(Exception2 e2) 
{ 
    dealWithError(2); 
} 
catch(Exception3 e3) 
{ 
    dealWithError(3); 
} 

... 

private void dealWithError(int i) 
{ 
    if(i == 1) // deal with Exception1 
    else if(i == 2) // deal with Exception2 
    else if(i == 3) // deal with Exception3 
} 
+2

正是沒有人應該做的事情。 「如果」街道上的噩夢。 – Shahzeb

1

我可以在相同的代碼添加到每個異常,但成爲一個維護的噩夢。

或者,如果你遮住了「例外」:

我可以在相同的代碼添加到每個[地方],而是成爲一個維護的噩夢。

這就是方法的提出。

private void cleanup() { /* clean up */ } 

... 

try { 
    // oh noes 

} catch (MyException me) { 
    cleanup(); 
} catch (AnotherException ae) { 
    cleanup(); 
} 

維護麻煩了!

+2

除現在你無法訪問調用者內部的東西。如果這是需要清理的東西,那麼你就會被洗淨。如果你把這些混亂的東西傳遞過來,那麼你就是在編寫需要修復的東西清單 - 如果這個清單後來改變了,你必須改變每一個使用它的地方。你會錯過一個。 – cHao

+0

噢,如果你堅持擁有它,這個''清理'函數應該*絕對*是'私人'。 – cHao

+0

@cHao雖然ture和finally是更好的,但是如果你錯過了一個地方,代碼就不會編譯,所以這樣還不壞 – Voo

0

你可以嘗試包裝異常處理程序的兩層,並重新拋出異常你已經完成了共同處理後:

try { 
     try { 
      // your code goes here 

     } catch (Throwable t) { 
      // do common exception handling for any exception 
      throw t; 
     }  

    } catch (NullPointerException nx) { 
     // handle NPE 
    } catch (Throwable t) { 
     // handle any other exception 
    } 

不知道我很喜歡這種解決方案雖然...感覺像一個有點黑客攻擊。我可能寧願看到在每個實例中明確處理的異常,即使這意味着重複調用某種共享清理函數。

相關問題