Python C API: как получить строковое представление исключения? - PullRequest
8 голосов
/ 16 июня 2009

Если я делаю (например)

 open("/snafu/fnord")

в Python (и файл не существует), я получаю трассировку и сообщение

 IOError: [Errno 2] No such file or directory: '/snafu/fnord'

Я хотел бы получить приведенную выше строку с помощью Python C API (то есть интерпретатор Python, встроенный в программу C). Мне нужно это как строка, а не вывод на консоль.

С помощью PyErr_Fetch() я могу получить объект типа исключения и значение. Для приведенного выше примера значение является кортежем:

 (2, 'No such file or directory', '/snafu/fnord')

Есть ли легкий путь от информации, которую я получаю от PyErr_Fetch() к строке, которую показывает интерпретатор Python? (Тот, который не требует создания таких строк для каждого типа исключения самостоятельно.)

1 Ответ

6 голосов
/ 16 июня 2009

Я думаю, что исключения Python печатаются путем запуска «str ()» для экземпляра исключения, который возвращает интересующую вас отформатированную строку. Вы можете получить это из C, вызвав PyObject_Str() метод, описанный здесь:

https://docs.python.org/c-api/object.html

Удачи!

Обновление: Я немного запутался, почему второй элемент, возвращаемый вам PyErr_Fetch(), является строкой. Я предполагаю, что вы получаете «ненормализованное исключение» и вам нужно вызвать PyErr_NormalizeException(), чтобы превратить этот кортеж в «настоящее» исключение, которое может отформатировать себя как строку, как вы этого хотите.

...