Python: сопоставить errno с подклассом OSError - PullRequest
3 голосов
/ 02 апреля 2020

У меня есть программа Python 3, которая вызывает функцию C. Функция C возвращает целое число: 0 при успехе или соответствующее errno при ошибке. В случае неудачи код Python может просто поднять OSError. Но я бы предпочел, чтобы он поднял соответствующий подкласс OSError.

Например, если программа Python получает код возврата 2, она должна повысить FileNotFoundError, подкласс OSError , Я уже могу найти правильный подкласс, выполнив следующие три шага. Очевидно, что производительность не является проблемой, потому что мне нужно выполнять эти шаги только один раз для версии Python 3 для всех значений errno и кэшировать результаты.

  1. Найти все подклассы OSError. Это легко, используя __subclass__, рекурсивно, если необходимо.
  2. Сопоставьте все значения errno с именами. Например, если errno равно 2, это должно соответствовать ENOENT. Это делается путем анализа соответствующего C включаемого файла. Например, во FreeBSD этот файл будет /usr/include/errno.h.
  3. Отображать errno имена в OSError подклассы. Это можно сделать с помощью синтаксического анализа кода HTML, например, http://docs.python.org/release/3.8.2/library/exceptions.html

Но шаг 3 действительно очень интересен. Есть ли способ, которым я могу сделать этот шаг без разбора документации? Есть ли что-то, что я могу как-то проверить в Python, который сидит на моем локальном хосте?

1 Ответ

1 голос
/ 02 апреля 2020

Когда вы смотрите документацию, я считаю, что этот перевод выполняется автоматически. если вы, например, позвоните:

raise OSError(2, 'this went wrong') # here the 2 corresponds to the error given by C
# raises -> FileNotFoundError: [Errno 2] this went wrong

Для точного отображения, использованного здесь go на страницу , вы ссылаетесь и смотрите раздел исключений ОС.

...