Как выполнить код следующей строки, если текущая строка выдает исключение - PullRequest
0 голосов
/ 06 мая 2020

У меня есть определенное требование. Когда текущая строка кода генерирует исключение, я хочу перейти к следующей строке

FileStream fs = new FileStream("D:/temp/product.xml", FileMode.Open, FileAccess.Read);

иногда D:/ диск не имеет xml файла, он выбрасывает FileNotFoundException и выскакивает управление за пределы области. но затем в следующей строке я хочу проверить другое местоположение

FileStream fs = new FileStream("//letp.rf.servername.com/products/product.xml", FileMode.Open, FileAccess.Read);

Как я могу исправить эту проблему?

Ответы [ 4 ]

6 голосов
/ 06 мая 2020

Используйте защитную проверку и проверьте, существует ли файл, используя метод File.Exists(String), прежде чем обращаться к нему. Опять же, везде, где это возможно, мы должны использовать Defensive Check вместо Exception Handling , поскольку обработка исключений - дорогостоящая операция. Насколько дорого обходятся исключения в C#?

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

try 
{
  if (File.Exists("D:/temp/product.xml"))
  {
     FileStream fs = new FileStream("D:/temp/product.xml", FileMode.Open, FileAccess.Read);
  }
  else
  {
    // check another location
  }
}
catch (Exception ex)
{
  // perform logging
}
5 голосов
/ 06 мая 2020
• 1000 (Кстати, ответ Рахула лучше и проще)

Чтобы использовать это в al oop:

FileSystem fs = null;
foreach (var file in files) // files contains the file paths
{
    // Solution #1
    try
    {
        fs = new FileStream(file, FileMode.Open, FileAccess.Read);
        break;
    }
    catch (FileNotFoundException e) { }

    // Or you can use File.Exists as per Rahul's answer
    // Solution #2
    if (File.Exists(file))
    {
        fs = new FileStream(file, FileMode.Open, FileAccess.Read);
        break;
    }
}
2 голосов
/ 06 мая 2020

Не используйте исключения, чтобы проверить, существует ли файл, но проверьте, существует ли файл через File.Exists :

string defaultPath = "D:/temp/product.xml";
string alternativePath = "//letp.rf.servername.com/products/product.xml";
string path = File.Exists(defaultPath) ? defaultPath : alternativePath;

FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);

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

string[] paths = new string[] { @"C:\first\path\product.xml", @"C:\second\path\product.xml", @"C:\third\path\product.xml"};
string path = paths.FirstOrDefault(p => File.Exists(p));
if(path == null)
 {
 Console.WriteLine("None of the files exists!");
 }
else
 {
 FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
 }
1 голос
/ 06 мая 2020

Просто используйте try и catch и l oop:

foreach (var file in files)
{
    try 
    {
        FileStream fs = new FileStream(file , FileMode.Open, FileAccess.Read);
    }
    catch(Exception ex)
    {}
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...