Разница между броском нового исключения без окружающего улова и помещением его в улов? - PullRequest
1 голос
/ 12 апреля 2011

В чем разница (если есть) в письменной форме:

if (File.Exists(filePath)) 
    //Something
else
    throw new FileNotFoundException();

И окружение блока if / else выше в пробной скобке с уловом.

На самом деле нужен улов? Если так, что это поймает? Или, возможно, лучшее сравнение - поместить часть if указанного выше блока в пробную скобку (без оператора if) и поймать FileNotFoundException, выбрасывая стек вызовов (throw).

Спасибо

Ответы [ 5 ]

1 голос
/ 12 апреля 2011

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

0 голосов
/ 12 апреля 2011

Окружение блока if пробным уловом означает, что вам придется обрабатывать пропущенный файл тут же в улове (см. Ответ @ lukas). Если вы собираетесь обработать отсутствующий файл в этом коде, то вам не нужен else-throw, потому что вы уже знаете, что файл отсутствует в первом if. С другой стороны, если вы хотите, чтобы вызывающий код (где-то выше стека вызовов) обрабатывал пропущенный файл, тогда передача этой информации в исключении - это нормально, но вы не хотите затем оборачивать бросок в попытка поймать, потому что это не будет выброшено из этого блока кода.

0 голосов
/ 12 апреля 2011

Да, улов необходим из-за состояния гонки.Другой процесс / поток может удалить / изменить / переместить / и т. Д.файл.И вы не можете предотвратить это.

try
{
  using (//your file opens here)
  {

  }
}
catch (FileNotFoundException)
{
  // handle FileNotFoundException
}
0 голосов
/ 12 апреля 2011

Обработка исключений - это проблема приложения.Если вас интересует (а) исключение или (б) конкретное исключение, вы используете try / catches.

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

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

  • При возврате через границу обслуживания.Иногда это связано с безопасностью (скрывая детали реализации), хотя в основном для улучшения диагностики во время выполнения
  • При выполнении вызова через границу службы.Обычно это связано с надежностью, хотя, опять же, больше для устранения неполадок.

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

0 голосов
/ 12 апреля 2011

Один из них безопаснее другого.

Когда вы проверяете, существует ли файл, ничто не гарантирует, что файл будет дальше при выполнении метода.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...