Как правильно создать FileNotFoundError?

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

FileNotFoundError: [Errno 2] No such file or directory: 'nothing.txt'

возникает некоторое неясное сообщение:

OSError: Syntax error in file None (line 1)

Я не хочу обрабатывать недостающий файл, не хочу улавливать и обрабатывать исключение, не хочу поднимать настраиваемое исключение, не хочу, чтобы я был open, и не создавал его, если он не существует.

Я хочу только проверить его (os.path.isfile(filename) выполнит трюк), а если нет, то просто поднимите файл FileNotFoundError.

Я пробовал это:

#!/usr/bin/env python3

import os

if not os.path.isfile("nothing.txt"):
    raise FileNotFoundError

какие только выходы:

Traceback (most recent call last):
  File "./test_script.py", line 6, in <module>
    raise FileNotFoundError
FileNotFoundError

Это лучше, чем "Синтаксическая ошибка в файле None", но как можно поднять "реальное" исключение python с правильным сообщением, не переустраивая его?

Ответы

Ответ 1

Передать аргументы:

import errno
import os

raise FileNotFoundError(
    errno.ENOENT, os.strerror(errno.ENOENT), filename)

FileNotFoundError является подклассом OSError, который принимает несколько аргументов. Первый - это код ошибки из errno module (файл не найден всегда errno.ENOENT), второй - сообщение об ошибке (используйте os.strerror(), чтобы получить это) и передать имя файла как третье.

Окончательное строковое представление, используемое в трассировке, построено из этих аргументов:

>>> print(FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), 'foobar'))
[Errno 2] No such file or directory: 'foobar'