Python C API: как получить строковое представление исключения?

StackOverflow https://stackoverflow.com/questions/1001216

  •  05-07-2019
  •  | 
  •  

Вопрос

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

 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? (Тот, который не требует создания таких строк для каждого типа исключения самостоятельно.)

Это было полезно?

Решение

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

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

Удачи!

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top