2010-06-04 80 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)  
    { } 
}