В таком примере, как вы привели,
if()
проверяет только условие существования файла или директории. А
try-catch
обработает бОльшее число ситуаций: если это не файл, а директория, если права не позволяют читать, если устройство гакнулось и не прочиталось.
пример автора вопроса# Вариант 1:
f getFileContent(filename){
if (!file_exists(filename)) {error: file not found}
return file_content(filename)
}
# Вариант 2:
f getFileContent(filename){
try return file_content(filename)
catch FileNotFoundException {error: file not found}
}
По замыслу
if
отличается тем, что проверяет
предусмотренные варианты, а исключения кидаются в
непредусмотренных. Все бросаемые исключения надо документировать, чтобы их кто-то где-то, в итоге, поймал.
Условные операторы только для локальной логики внутри функции. Отлов исключений может иметь многоуровневую иерархию вне функции, класса. Например, случай не файла-а-папки отловится в одном, а случай нечитаемого сломанного устройства – на самом верхнем уровне всего приложения. И по-разному будут обработаны.
Внешние материалы по теме:
- Пост по теме (на англ.)
- скорость выполнения с исключениями и без (без быстрее)
- Exception patterns, в частности: