2009-06-16 4 views
8

Se faccio (per esempio)API C Python: come ottenere la rappresentazione stringa dell'eccezione?

open("/snafu/fnord") 

in Python (e il file non esiste), ottengo un traceback e il messaggio

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

vorrei ottenere la stringa di cui sopra con Python API C (cioè un interprete Python incorporato in un programma C). Ho bisogno di una stringa, non di uscita alla console.

Con PyErr_Fetch() È possibile ottenere l'oggetto tipo dell'eccezione e il valore. Per l'esempio precedente, il valore è una tupla:

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

C'è un modo semplice dalle informazioni che ricevo da PyErr_Fetch() alla stringa spettacoli interprete Python? (Uno che non comporta la costruzione di tali stringhe per ogni tipo di eccezione.)

risposta

6

Penso che le eccezioni Python vengano stampate eseguendo "str()" nell'eccezione, che restituirà la stringa formattata che ti interessa . in È possibile ottenere questo da C chiamando il metodo PyObject_Str() descritto qui:

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

Buona fortuna!

Aggiornamento: Sono un po 'confuso perché il secondo elemento restituito da PyErr_Fetch() è una stringa. La mia ipotesi è che si sta ricevendo una "eccezione non normalizzata" e che è necessario chiamare lo PyErr_NormalizeException() per trasformare quella tupla in un'eccezione "reale" che può formarsi come una stringa come si desidera.

+0

Il secondo argomento è una tupla e non una stringa. E chiamo già PyErr_NormalizeException(). Ma PyErr_Fetch() non restituisce un oggetto eccezione, solo il tipo di eccezione. Quindi devo creare io stesso l'oggetto di eccezione, immagino? E passo il secondo argomento di PyErr_Fetch() al costruttore? – ashcatch

+0

Oh, ho appena controllato il mio codice e non ho chiamato PyErr_NormalizeException() in tutti i casi. Chiamandolo, inverte effettivamente il secondo argomento in un oggetto di eccezione. E convertirlo in una stringa con PyObject_Str() mi ottiene il risultato desiderato. Molte grazie. – ashcatch