Переход к следующему большому двоичному объекту в блоке ForEach при наличии исключения в блоке Catch

#c# #xml #linq #azure

#c# #xml #linq #azure

Вопрос:

У меня много XML-файлов в контейнере хранения Azure. Я написал код для удаления ненужных элементов данных из этих XML-файлов. Чтобы перечислить все XML-файлы в разных структурах папок, я использовал

 var blobs = container.ListBlobs(prefix: <Root Location of Blobs>, useFlatBlobListing: true);
 foreach (CloudBlockBlob blob in blobs)
  

И для анализа xml я использую Linq.

Проблема, с которой я сталкиваюсь, заключается в том, что существует несколько XML-файлов, в которых отсутствует правильный формат, или несколько XML-файлов, в которых нет закрывающих литералов. Я хочу перехватить исключение и пропустить этот XML-файл из обработки и перейти к следующему. Как я могу это сделать, используя блок Try catch ?

Исключение, которое я получаю, это System.Xml.XmlException

Ответ №1:

Попробуйте

     foreach (CloudBlockBlob blob in blobs){               
             bool isError = false;   
            try   
            {                          
               // do your code here;   
            }catch(Exception ex){
                isError = true;
            }
           if(isError) continue;
        }
  

Обновить:

 void Main()

    {
        string[] list = new string[]{"bob", "jack", "tom", "sparrow"};
        foreach(string li in list){
            try{
                if(String.Equals(li, "tom")){
                    throw new Exception("Fault");
                }
                Debug.WriteLine(li);
            }catch(Exception ex){
                Debug.WriteLine(ex.Message);
                continue;
            }
        }
    }
  

С принтами:

 bob
jack
Fault
sparrow
  

Комментарии:

1. Весь этот флаг isError не нужен.

2. @PeterBons: Тогда как я могу перейти к следующему двоичному объекту, если у текущего есть исключение?

3. если вы добавляете try / catch вокруг своих операторов внутри цикла foreach, все в порядке. Итак, следуйте этому ответу без isError, он автоматически пропустит сбойный двоичный объект.

4. @PeterBons: Я сделал это, но в настоящее время мой процесс записывает ошибку в журнал ошибок, и на этом работа заканчивается… Он не переходит к следующему двоичному объекту.

5. Хорошо, где происходит сбой. здесь: var blobs = container.ListBlobs(prefix: <Root Location of Blobs>, useFlatBlobListing: true); или внутри foreach (CloudBlockBlob blob in blobs) ?