2012-05-17 56 views
1

我已經看過其他try catch finally這裏的問題,但我不確定這個問題已經得到解答。是否有異味做這樣的事情:Try/Catch /最後,最後使用catch中的異常?

Exception? ex = null; 
try { //something } 
catch (Exception e) { ex = e ;} 
finally { 
    DoSomething();   
} 
... //more code 

//end of method 
if (ex !=null) { throw ex; } 

基本上,我試圖確保某些代碼(try/catch語句外/最後)運行,並且如果發生了一個異常被拋出,但直到所述代碼運行之後。我無法將所有代碼放在finally塊中,因爲它不在某些條件之內。

如果確實如此,其實氣味不好(我懷疑它確實如此),如何實現這一目標?

+0

你在那個catch裏面的地方做了些什麼有用的事情,最後是不允許remove catch和異常傳播?我猜如果你拋出了前者,那麼當你捕獲它時(如源碼等),你會得到更少的信息。 –

回答

6

這絕對是一種代碼味道。在方法的末尾重新拋出異常將覆蓋異常的調用堆棧,以便顯示所有異常發生在方法的末尾而不是它們真正發生的位置。

如果你不能把多餘的代碼在現有的最後,創建try..finally嵌套塊:

try { 
    try { //something } 
    finally { 
     DoSomething();   
    } 
    ... //more code 
} 
finally { 
    // cleanup code 
} 

注意從OP:看到this code什麼這個答案的作者主導我正確地派生。

+0

我仍然想拋出異常的地方。我在哪裏把它扔在這個例子中? '扔';' – Jason

+0

';'在第二個結尾{}塊將重新拋出異常,使堆棧跟蹤保持原樣。 – TheEvilPenguin

+0

@TheEvilPenguin - 拋出第二個finally塊的末尾是一個語法錯誤。 – shf301

0

既然你想運行「更多的代碼」,即使發生異常,爲什麼不把「更多的代碼」放在最後?這是本質的東西最終是 - 它保證的廣告,即使發生異常

這樣執行:

try { 
    // something 
} catch (Exception e) { 

    ***// more code here*** 

    DoSomething(); 
    throw; 
} 

存儲EX和EX扔;會吞噬內心的期待。你想拋出;以確保吞噬堆棧中的任何東西。

+1

我在帖子末尾提到我不能將所有代碼放在'finally'中,因爲它不在某些條件語句之內。 – Jason