Lê Hiển Vinh Ответов: 4

Как я могу пропустить исключение?


Когда я запускаю этот код :
FileInfo[] fs_infos = dir_info.GetFiles(pattern);//error here

            foreach (FileInfo fs_info in fs_infos)
            {
                if (target.Length == 0)
                {
                    listBox1.Items.Add(fs_info.FullName);
                }
                else
                {
                    string txt = File.ReadAllText(fs_info.FullName);

                    if (txt.IndexOf(target, StringComparison.OrdinalIgnoreCase) >= 0)
                    {
                        listBox1.Items.Add(fs_info.FullName);

                    }


                }
            }

я получил исключение IOexception.
Я хочу пропустить этот файл и получить другие файлы.Как я могу это сделать?

Что я уже пробовал:

Я пробовал использовать try catch , я получаю ошибку имя fs_infos не существует в текущем контексте ent

4 Ответов

Рейтинг:
29

OriginalGriff

Цитата:
Я пробовал использовать try catch , я получаю ошибку имя fs_infos не существует в текущем контексте ent
Единственный способ "пропустить исключение" - это использовать try...catch, но есть вероятность, что вы используете его неправильно.
При угадывании вы ставите блок только вокруг первой строки:
try
   {
   FileInfo[] fs_infos = dir_info.GetFiles(pattern);
   }
catch (...)
   {
   ...
   }
foreach (FileInfo fs_info in fs_infos)
   {
Что создает его собственный объем, так что fs_infos доступен только внутри try...catch блок.

Вам нужно поставить его вокруг всего этого, если ошибка ввода-вывода возникает при вызове GetFiles:
try
   {
   FileInfo[] fs_infos = dir_info.GetFiles(pattern);
   foreach (FileInfo fs_info in fs_infos)
      {
      ...
      }
   }
catch (...)
   {
   ...
   }
Потому что GetFiles не будет возвращать никаких значений, если он создает исключение.
Если это не та строка, которая вызывает исключение, и вы хотите пропустить файлы, которые это делают, вам нужна вторая строка try...catch блок также находится внутри петли:
try
   {
   FileInfo[] fs_infos = dir_info.GetFiles(pattern);
   foreach (FileInfo fs_info in fs_infos)
      {
      try
         {
         ...
         }
      catch (...)
         {
         ...
         }
      }
   }
catch (...)
   {
   ...
   }


Lê Hiển Vinh

Большое спасибо!
Ваше решение очень полезно

OriginalGriff

Всегда пожалуйста!

BillWoodruff

+5 голосов вверх, чтобы противодействовать необоснованному понижению голоса.

BillWoodruff

может быть, я галлюцинировал, что был голос против? :)

OriginalGriff

Я так не думаю - может быть, ОП пересмотрел его?

Рейтинг:
23

BillWoodruff

Я советую вам никогда не игнорировать исключение: когда вы поймаете исключение, повторно бросьте его.

Рассмотрим этот пример:

string path = @"C:\Users\test_user\Desktop\Test";
FileInfo[] fs_infos;
string target = "";

// Directory must exist !
if (!Directory.Exists(path))
{
    throw new DirectoryNotFoundException(@"no directory named: {path}");
}

DirectoryInfo dir = new DirectoryInfo(path);

// several types  of errors might occur here:
// UnauthorizedAccessException 
// InvalidOperationException
// etc.
try
{
    fs_infos = dir.GetFiles();
}
catch (Exception exception)
{
    // put a break-point here and examine the error
    Console.WriteLine(exception);
    throw;
}

// any files ?
if (fs_infos.Length == 0)
{
    throw new FileNotFoundException(@"no files in: {path}");
}

// now you can process files
Рассмотрите возможность использования NET >= 4 EnumerateFiles: [^]

Рассмотреть возможность привязки данных вашего ListBox элемент управления, чтобы коллекция FileInfo может:
BindingSource bs = new BindingSource();
bs.DataSource = fs_infos;

listBox1.DisplayMember = "Name"
listBox1.DisplayMember = "FullName";

listBox1.DataSource = bs;
Затем: имя файла (а не полный путь к файлу) будет отображаться в списке, а в 'SelectedValueChanged EventHandler 'SelectedValue будет полным путем к файлу.


Lê Hiển Vinh

Большое вам спасибо за ваш совет

BillWoodruff

Пожалуйста, обратите внимание, что я внес изменения в пример привязки в конце: вы всегда должны устанавливать свойство 'DataSource после установки элементов' Display и 'Value.

Рейтинг:
14

Udhay Titus P

Используйте метод invoke, чтобы игнорировать исключение, или вы можете попробовать

SpecificException
попробуйте этот код
try
{
   // code
}
catch (SpecificException)
{ }


Полезные ссылки для вас

C# лучший способ игнорировать исключение - переполнение стека[^]
Игнорировать исключение в C# - переполнение стека[^]
Явное игнорирование исключений в C# - Веб-журнал Рика Штрала[^]


Lê Hiển Vinh

Большое спасибо!

Рейтинг:
0

Member 13838971

Дальше в секции catch

try
{
   // code
}
catch (SpecificException)
{
continue;
}