Охранное предложение и обработка исключений для одного и того же условия - PullRequest
2 голосов
/ 08 мая 2009

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

    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 ]

2 голосов
/ 08 мая 2009

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

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

1 голос
/ 08 мая 2009

Я голосую за Снимите отметку .Exists().

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

0 голосов
/ 09 мая 2009

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

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

0 голосов
/ 08 мая 2009

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

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

...