Игнорировать определенное типизированное исключение - PullRequest
2 голосов
/ 04 июня 2010

Я хотел бы игнорировать определенный тип исключения в группе операторов; без необходимости помещать пустые 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 способ в улове

Ответы [ 4 ]

4 голосов
/ 04 июня 2010

Вот простой способ:

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) { }
}
3 голосов
/ 04 июня 2010

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

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

var list = List<objects_to_update> ();

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

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

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

1 голос
/ 04 июня 2010

Связаны ли эти объекты o1, o2, o3? Не могли бы вы поместить их в коллекцию или массив?

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

Псевдокод для иллюстрации:

foreach(DataTypeOfO o in CollectionOfOs)
{
    try
    {
          o.Update(); 
    }
    catch(Exceptions.NoChangeMade ex)     
    { }
}
0 голосов
/ 04 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...