Охранное предложение и обработка исключений для одного и того же условия
Я наткнулся на следующий фрагмент кода. Имена были изменены, чтобы защитить невинных:
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#.