2009-06-16 17 views
8

Si hago (por ejemplo)Python C API: cómo obtener una representación de cadena de excepción?

open("/snafu/fnord") 

en Python (y el archivo no existe), aparece un rastreo y el mensaje

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

me gustaría obtener la cadena anterior con Python C API (es decir, un intérprete de Python integrado en un programa C). Lo necesito como una cadena, no como salida a la consola.

Con PyErr_Fetch() puedo obtener el tipo de objeto de la excepción y el valor. Para el ejemplo anterior, el valor es una tupla:

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

¿Hay una manera fácil de la información que recibo de PyErr_Fetch() a la cadena de los espectáculos intérprete de Python? (Uno que no implica la construcción de tales cadenas para cada tipo de excepción).

Respuesta

6

Creo que las excepciones de Python se imprimen ejecutando "str()" en la instancia de excepción, que devolverá la cadena formateada que le interese . en puede obtener esta información de C llamando al método descrito aquí PyObject_Str():

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

Buena suerte!

Actualización: Estoy un poco confundido por qué el segundo elemento devuelto por PyErr_Fetch() es una cadena. Supongo que está recibiendo una "excepción no normalizada" y necesita llamar al PyErr_NormalizeException() para convertir esa tupla en una Excepción "real" que puede formatear a sí misma como una cadena como usted lo desea.

+0

El segundo argumento es una tupla y no una cadena. Y ya llamo PyErr_NormalizeException(). Pero PyErr_Fetch() no devuelve un objeto de excepción, solo el tipo de excepción. Entonces creo que tengo que crear el objeto de excepción, ¿no? Y paso el segundo argumento de PyErr_Fetch() al constructor? – ashcatch

+0

Oh, acabo de comprobar mi código y no he llamado a PyErr_NormalizeException() en todos los casos. Llamarlo, de hecho convierte el segundo argumento en un objeto de excepción. Y convertir eso en una cadena con PyObject_Str() me da el resultado deseado. Muchas gracias. – ashcatch

Cuestiones relacionadas