C # - Продолжить цикл foreach (), если происходит ошибка - PullRequest
1 голос
/ 17 ноября 2010

В настоящее время у меня есть просмотр списка и папка, полная документов XML. Я использую цикл foreach () для прохождения всех файлов XML и загрузки данных в просмотр списка соответственно. Мой вопрос заключается в том, как мне продолжить цикл foreach (), если в нем есть ошибка (например: если один из файлов XML не является полностью допустимым, содержит ошибки и т. Д.), И все же добавить данные в просмотр списка? Я не спрашиваю, как разобрать XML или как загрузить его в просмотр списка, я так много знаю, как это сделать, но не о том, как продолжить цикл, если происходит ошибка.

Ответы [ 7 ]

5 голосов
/ 17 ноября 2010

Хочешь:

foreach(var xml in xmls)
{
   try
   {
     //import xml to listview
   }
   catch (SomeException e)
   {
     //deal with the exception here
   }
}
1 голос
/ 17 ноября 2010

Оберните внутреннее содержимое цикла в блоке try ... catch.

например

foreach (var foo in iterableThing) {
    try {
        DoStuff(foo);
    }
    catch (AppropriateException) {
        // Handle the exception (or ignore it)...
    }
    catch (SomeOtherException) {
        // Handle the exception (or ignore it)...
    }
}
0 голосов
/ 17 ноября 2010

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

static void SafeForEach<T>(this IEnumerable<T> source, Action<T> op) {
  foreach(var el in source) {
    try { op(el); }
    catch (Exception e) { }
  }
}

Тогда вы можете написать просто:

xmls.SafeForEach(xml => {
     // Xml processing
  });

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

foreach(var xml in xmls.Where(x => x.IsValid)) { 
  // Xml processing
}
0 голосов
/ 17 ноября 2010

Если ваш код обработки выдает исключения, используйте блок try/catch. Если вы проверяете результаты какого-либо метода с помощью блока if, используйте continue.

0 голосов
/ 17 ноября 2010

Я думаю, вы должны сделать это:

foreach(var doc in docs)
{
    //Make a function to evaluate the doc
    if(isValid(doc))
    {
        //Logging or something
        continue;
    }
    //Add data to listview
}
0 голосов
/ 17 ноября 2010

Вы можете выполнить обработку файла в блоке try catch и обработать условие ошибки. Вы можете корректно обработать ошибки в catch и продолжить загрузку данных.

0 голосов
/ 17 ноября 2010

ты бы не сделал

foreach( loop )
{
   try {
   }
   catch (Exception ex)
   {
      // all errors caught here, but the loop would continue
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...