Охранное предложение и обработка исключений для одного и того же условия

Я наткнулся на следующий фрагмент кода. Имена были изменены, чтобы защитить невинных:

    public void RunProgram()
    {
        System.IO.FileInfo fInfo = new System.IO.FileInfo(Application.StartupPath + "Program.exe");

        if (!fInfo.Exists)
        {
            System.Windows.Forms.MessageBox.Show("Program could not be found, please verify your installation.\n\nDetails:\n" + fInfo.FullName);
            return;
        }

        try
        {
            System.Diagnostics.Process  process = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo pStart  = new System.Diagnostics.ProcessStartInfo(); 
            pStart.FileName = fInfo.FullName;
            pStart.UseShellExecute = true;
            process.StartInfo = pStart;
            process.Start();
        }
        catch
        {
            System.Windows.Forms.MessageBox.Show(string.Format("An error occurred trying to run the program:{0}", fInfo.FullName));
        }
    }

Я знаю, что здесь что-то не так:

  • Типы исключений не обрабатываются индивидуально
  • Сообщение об ошибке недостаточно информативно

Будьте уверены, я тоже буду к ним обращаться, но мой главный вопрос касается проверки существования файла непосредственно перед блоком try/catch. Это кажется мне немного излишним.

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

Как вы думаете?

4 ответа

Решение

Это избыточно и может дать ложное чувство безопасности. Обратите внимание, что вы все равно можете получить исключение FileNotFound из-за параллелизма.

Также см.: Есть ли случай, когда проверка параметров может считаться избыточной?

Отсутствие файла - это то, что мы можем разумно предвидеть - и так как мы находимся на уровне пользовательского интерфейса (я полагаю, так как MessageBox), имеет смысл разумно проверить запрос, а просто сообщить пользователю напрямую и отменить.

Если бы мы были глубоко в недрах кода (несколько уровней удалены из пользовательского интерфейса), то исключение было бы правильным, но я все равно, вероятно, сначала проверил бы наличие файлов и выдал бы заметную ошибку. Конечно, любая проверка на наличие файла - это условие состязания потоков;-p

Я голосую за удаление .Exists() проверять.

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

Я всегда стараюсь избегать исключений. Обычно это происходит из-за того, что я обычно запускаю Visual Studio с включенными перерывами на исключения, поэтому стараюсь по возможности избегать исключений.

Я также провел значительное количество времени, работая над встроенными системами, где создание исключения было дорогостоящим. Это может быть не так для C#.

Другие вопросы по тегам