2010-06-04 101 views
2

我想忽略一組語句中的特定類型的異常;而無需在其周圍放置空的Try..Catch忽略特定類型的異常

try{ o1.Update(); } catch (Exceptions.NoChangeMade ex) {} 
try{ o2.Update(); } catch (Exceptions.NoChangeMade ex) {} 
try{ o3.Update(); } catch (Exceptions.NoChangeMade ex) {} 

我想無論是On Error Resume型的方式,或捕捉

+0

你可能會考慮替代方案時,不會發生變化,拋出異常。 (除非您無法控制Update方法。) – 2010-06-04 16:48:01

回答

3

如果你希望它們都更新內Continue方式,你真的沒有選擇無包裝例外。

你可以這樣做:

var list = List<objects_to_update>(); 

list.Add(o1); 
list.Add(o2); 
etc.  

list.ForEach(x=> 
    try{list.Update()} 
    catch{} 
); 

你還是要包起來異常,但至少這樣你只能寫一次。

+0

唯一的另一種選擇是在'Update'中處理異常。 – 2010-06-04 16:45:39

+0

@傑夫,那也是真的。我假設他無法改變更新聲明。 – kemiller2002 2010-06-04 16:47:02

+0

我同意這個假設......如果Exception是無用的,可以安全地忽略,那麼如果OP有控制Update的權限,他應該不會拋出異常。 – Joren 2010-06-04 16:49:54

0

如果o1/o2/o3都是相同的類,則在.Update()方法中放置1個try catch以捕獲您正在查找的特定異常。或者更好的是,改變代碼,使其不會拋出異常。

4

這裏有一個簡單的方法:

ExecuteIgnore(o1.Update); 
ExecuteIgnore(o2.Update); 
ExecuteIgnore(o3.Update); 
... 
private static void ExecuteIgnore(Action action) 
{ 
    try { action(); } 
    catch(Exceptions.NoChangeMade) { } 
} 

你可以使其更加通用的(如果時間長一點)是這樣的:

ExecuteIgnore<Exceptions.NoChangeMade>(o1.Update); 
ExecuteIgnore<Exceptions.NoChangeMade>(o2.Update); 
ExecuteIgnore<Exceptions.NoChangeMade>(o3.Update); 
... 
public static void ExecuteIgnore<T>(Action action) where T : Exception 
{ 
    try { action(); } 
    catch(T) { } 
} 
1

難道這些O1,O2,O3的對象有關係嗎?你可以把它們放在一個集合或一個數組中嗎?

如果你這樣做,你可以修改你的代碼來使用循環來更新項目,然後你可以讓空的catch塊有效地將控制權交給下一次迭代循環。

一些僞代碼來說明:

foreach(DataTypeOfO o in CollectionOfOs) 
{ 
    try 
    { 
      o.Update(); 
    } 
    catch(Exceptions.NoChangeMade ex)  
    { } 
}