Ho alcuni problemi nella gestione delle eccezioni C++ personalizzate quando si chiama da Cython. La mia situazione è la seguente: Ho una libreria che utilizza CustomLibraryException
per tutte le eccezioni. Quello che voglio è fondamentalmente ottenere il messaggio di errore e sollevare un errore Python con esso.Gestione di eccezioni C++ personalizzate in Cython
Il user guide ha alcuni suggerimenti ma è un po 'non specifico. La prima possibilità è quella di fare:
cdef int bar() ad eccezione ValueError +
Questo converte il CustomLibraryException
ad un ValueError
, ma perde il messaggio di errore.
L'altra possibilità è quella di convertire in modo esplicito l'errore utilizzando
cdef int raise_py_error()
cdef int something_dangerous() except +raise_py_error
Non mi understant questa soluzione. Ho capito che raise_py_error deve essere una funzione C++ che in qualche modo gestisce l'errore. Non sono sicuro di come gestirlo però. La funzione non ottiene un argomento e viene chiamata all'interno del blocco catch
in C++.
Se qualcuno ha un esempio funzionante di gestione di un'eccezione C++ in Cython, sarebbe di grande aiuto.
L'eccezione non deriva da '' std :: runtime'' come previsto. Grazie per l'aiuto :) Questo non lo rende molto meglio, però. Le funzioni che sollevano l'errore sono funzioni membro e non voglio cambiare il loro codice. Si tratta dei miei [gco wrapper] (http://peekaboo-vision.blogspot.de/2012/05/graphcuts-for-python-pygco.html) e la licenza non mi consente di ridistribuire: -/ –
@ AndreasMueller: le funzioni membro possono essere facilmente racchiuse in funzioni indipendenti; basta passare l'oggetto su cui dovrebbero operare come primo argomento: 'void wrapper (Obj & o, int ham) {return o.wrapped (ham); } ' –
Sì, lo so, ero solo pigro per farlo ancora;) Btw, lo sapevi che sei il 100 ° poster per SO? –