Любые различия в производительности - не главное.
Проверка того, что файл существует в какой-то момент перед открытием, не гарантирует, что другой поток или процесс не удалили или не заблокировали файл; Вы знаете только в момент попытки открыть его независимо от того, добились ли вы успеха. Следовательно, вызовы ОС часто возвращают коды успеха или ошибок или возвращают известное значение, указывающее на недопустимый дескриптор файла.
В объектно-ориентированной среде удобнее использовать идиому, заключающуюся в том, что создание объекта получает ресурс ( RAII ), после чего вы должны вызвать исключение, а не разрешить создание недопустимого объекта. В качестве альтернативы, вы можете иметь объектно-ориентированный интерфейс ОС, который возвращает ссылку на известный плохой объект (например, ноль), но затем вы откладываете исключение на более поздний этап программы, поэтому может не знать, какой файл не удалось открыть .
Другое преимущество состоит в том, что она позволяет библиотеке, предоставляющей объекту, решать, каковы условия его действительности - если файл на самом деле является ссылкой на сервер WebDav, то другие условия, такие как наличие действительного сетевого интерфейса, будут быть обязательным. Если библиотека позаботится об условиях, детали реализации будут скрыты от клиентского кода (это относится к библиотечным API-интерфейсам при попытке / захвате)