Tengo algunos problemas para manejar excepciones personalizadas de C++ cuando llamo desde Cython. Mi situación es la siguiente: tengo una biblioteca que usa CustomLibraryException
para todas las excepciones. Lo que quiero es básicamente obtener el mensaje de error y generar un error de Python con él.Manejo de excepciones de C++ personalizadas en Cython
El user guide tiene algunas pistas, pero es un poco inespecífico. La primera posibilidad es hacer:
cdef bar int() excepto + ValueError
Esto convierte la CustomLibraryException
a un ValueError
, pero pierde el mensaje de error.
La otra posibilidad es convertir explícitamente el error utilizando
cdef int raise_py_error()
cdef int something_dangerous() except +raise_py_error
realmente no understant esta solución. Entendí que raise_py_error tiene que ser una función de C++ que de alguna manera maneja el error. Aunque no estoy seguro de cómo manejarlo. La función no obtiene un argumento y se invoca dentro del bloque catch
en C++.
Si alguien tiene un ejemplo práctico de manejar una excepción de C++ en Cython, eso sería de gran ayuda.
La excepción no se deriva de '' std :: runtime'' como esperaba. Gracias por la ayuda :) Eso no lo hace mucho mejor, sin embargo. Las funciones que generan el error son funciones miembro y no quiero cambiar su código. Esto es sobre mis [envoltorios gco] (http://peekaboo-vision.blogspot.de/2012/05/graphcuts-for-python-pygco.html) y la licencia no me permite redistribuir: -/ –
@ AndreasMueller: las funciones de los miembros se pueden envolver fácilmente en funciones independientes; simplemente pase el objeto sobre el que deberían operar como primer argumento: 'contenedor vacío (Obj & o, int ham) {return o.wrapped (ham); } ' –
Sí, lo sé, era perezoso para hacerlo todavía;) Por cierto, ¿sabías que eres el mejor cartel número 100 en SO? –