2010-06-04 6 views
2

Я хотел бы игнорировать определенный тип исключения в группе операторов; без необходимости ставить пустые Try..Catch es вокруг них.Игнорировать конкретное типизированное исключение

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

Я хотел либо On Error Resume типа пути, или Continue пути внутри улова

+0

Вы могли бы рассмотреть альтернативы бросать исключение, если никаких изменений не происходит. (Если у вас нет контроля над методом Update.) –

ответ

3

Если вы хотите их всех обновления, вы на самом деле не были выбора без упаковки исключения.

Вы могли бы сделать что-то вроде:

var list = List<objects_to_update>(); 

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

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

Вы все еще будете иметь, чтобы обернуть их в виде исключения, но, по крайней мере, таким образом вы только пишете это один раз.

+0

Единственной альтернативой является обработка исключения в 'Update'. –

+0

@Jeff, это тоже правда. Я исходил из того, что он не мог изменить заявление об обновлении. – kemiller2002

+0

Я согласен с этим предположением ... если исключение бесполезно для того, чтобы его можно было игнорировать, тогда, если OP имеет контроль над Update, ему просто не нужно вообще это исключать. – Joren

0

Если o1/o2/o3 все одинаковы, тогда положите 1 try catch в метод .Update(), чтобы поймать конкретное исключение, которое вы ищете. Или еще лучше, измените код, чтобы он вообще не генерировал исключение.

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 объекты связаны между собой? Не могли бы вы поместить их в коллекцию или массив?

Если вы сделаете это, вы можете изменить свой код, чтобы использовать цикл для обновления элементов, а затем вы могли бы получить пустую блокировку захвата, чтобы передать управление на следующую итерацию цикла.

Некоторые псевдокод для иллюстрации:

foreach(DataTypeOfO o in CollectionOfOs) 
{ 
    try 
    { 
      o.Update(); 
    } 
    catch(Exceptions.NoChangeMade ex)  
    { } 
} 
Смежные вопросы