2011-02-20 51 views
1

我想處理更高級別的異常不在此方法,但我想確保對象& b正確關閉。如何正確處理多個異常thrower對象

close()方法也可以拋出異常。

此模板是否適合此解決方案或者有更智能/更簡單的解決方案?

public void foo() throws Exception { 
A a = null; 
B b = null; 
try { 
    a = new A(); 
    b = new B(); 
    ... 
} catch(Exception e) { 
    throw e; 
} 
finally { 
    Exception ex = null; 
    try { 
    if (a != null) 
    a.close(); 
    } catch(Exception x){ 
    ex = x; 
    } 
    try { 
    if (b != null) 
    b.close(); 
    } catch(Exception x) { 
    ex = x; 
    } 
    if (ex != null) 
    throw ex; 
} 
+1

爲什麼會將[c#]和[java]兩者都標記爲何的任何原因? – BoltClock

+0

你通過關閉方法的錯誤檢查獲得了什麼?爲什麼不讓他們進一步處理? –

回答

1
A a = null; 
try 
{ 
    a = new A(); 
    //do stuff 
} 
finally 
{ 
    a.Close(); 
} 

try塊不需要catch塊,它需要一個catchfinally塊(或兩者)。

1

正確解決這個問題的(在C#)是using語句:

using(A a = new A()) 
using(B b = new B()) 
{ 
    //... 
} 

這確保了ab是當控制離開塊Dispose d。

1

我只看到一個小問題:如果a.close()b.close()都失敗,那麼a.close()的異常就會丟失,因爲您會重複使用ex

您可以使用記錄器來保存異常消息 - 在這種情況下,只需在finally塊中拋出任意異常即可,因爲您已將錯誤消息保存在日誌文件中。

1
  1. 再說什麼Femaref說,你可以創建一個helper方法,以一個或多個可關閉的對象,並在必要時拋出異常。只是爲了減少冗餘。

  2. 通常需要返回原始錯誤消息而不是在close調用期間發生的錯誤消息。後者可能會直接跟隨前者,但您需要前者才能找到問題的真正原因。