Если вы обращаетесь к файлам, EAFP более надежен, чем LBYL, потому что операции, выполняемые в LBYL, не являются атомарными, и файловая система может меняться между временем просмотра и прыжком. На самом деле стандартное название - TOCTOU - время проверки, время использования; ошибки, вызванные неточной проверкой, являются ошибками TOCTOU.
Рассмотрите возможность создания временного файла, который должен иметь уникальное имя. Лучший способ узнать, существует ли выбранное имя файла, - это попытаться создать его - убедитесь, что вы используете параметры, чтобы гарантировать, что ваша операция завершится неудачно, если файл уже существует (в терминах POSIX / Unix флаг O_EXCL равен open()
). Если вы попытаетесь проверить, существует ли файл уже (возможно, с использованием access()
), то между временем, когда это говорит «Нет», и временем, когда вы пытаетесь создать файл, кто-то или что-то еще, возможно, создал файл.
И наоборот, предположим, что вы пытаетесь прочитать существующий файл. Ваша проверка, что файл существует (LBYL), может сказать «он там», но когда вы действительно откроете его, вы обнаружите, что «его там нет».
В обоих этих случаях вы должны проверить заключительную операцию - и LBYL не помог автоматически.
(Если вы связываетесь с программами SUID или SGID, access()
задает другой вопрос; он может относиться к LBYL, но в коде все равно необходимо учитывать возможность сбоя.)