Читаемость первого подхода выше, чем второго.
Второй вариант может быть достаточно быстрым, если у вас есть несколько предварительных условий для проверки; более того, он предполагает, что if / else каким-то образом находится в нормальном потоке, в то время как это действительно только для исключительных ситуаций.
Кроме того, выразительность первого подхода, следовательно, выше, чем второго.
Поскольку мы говорим о предварительных условиях , они должны быть проверены в начале процедуры, просто чтобы убедиться, что контракт соблюдается; по этой причине вся проверка должна быть каким-то образом отделена от остальной части процедуры.
По этим двум причинам я бы определенно выбрал первый вариант.
Примечание : Я говорю здесь о предварительных условиях: я ожидаю, что контракт вашей функции явно определяет файл как существующий, и поэтому отсутствие его будет признаком ошибки программирования.
В противном случае, если мы просто говорим об обработке исключений, я бы просто оставил это в File.Open, обрабатывая это исключение, только если есть какая-то идея о том, как с этим справиться.