2011-01-26 12 views
6

Estoy usando una biblioteca, que especifica en sus documentos API para definir una clase heredada de una clase particular de la biblioteca. La biblioteca en sí está escrita en C++ y los enlaces a Python se generan utilizando SWIG. El problema es que, cuando ejecuto mi código Python, no importa qué excepción arroje Python, aparece el error que dice "terminar llamado después de lanzar una instancia de 'Swig :: DirectorMethodException'".SWIG: Informar excepciones Python del código C++

Me gustaría que esta excepción generada por el código de Python se informara al ejecutar mi programa. Esp, esos casos donde recibo ZeroDivisionError.

Intenté hackear un poco siguiendo el método descrito en la documentación de SWIG en http://www.swig.org/Doc2.0/Python.html#Python_nn36 pero sin suerte. Sigo recibiendo el mismo mensaje "terminar llamado después de lanzar una instancia de 'Swig :: DirectorMethodException'" sin importar lo que puse en el archivo module.i.

¿Puede alguien darme consejos sobre cómo solucionar este problema, para que las excepciones de Python se notifiquen como están?

Respuesta

1

No sé qué tan avanzado está con su base de código, por lo que este puede ser de poca utilidad, pero tenía mejor suerte con impulso :: pitón que TRAGO. A continuación, puede hacer esto: boost::python Export Custom Exception

+1

Gracias por la ayuda. De hecho, solucioné este problema y la solución está aquí: https://github.com/madhusudancs/mesos/commit/93ed9f32d8752d687d6b6af6bcb6bfdf815f115d. Era bastante simple, pero definitivamente no estaba bien documentado. Además, este no es mi proyecto, por lo que solo puedo sugerir a los desarrolladores que utilicen boost :: python, pero no puedo hacerlo posible aunque –

+0

calculé que SWIG era obligatorio; Quería dejar la opción de impulso a las personas que se toparon con esta pregunta como yo :). Y ahora también tienen el SWIG. – ginbot

2

Informe de excepción planteada por Python en la consola del programa.

Esta es la solución útil de Madhusudan.C.S. Vea su comentario sobre la respuesta de ginbot. Lo estoy poniendo como una respuesta para que se vuelva más visible.

/* MyInterface.i */ 
%module(directors="1") MyInterface 
%feature("director:except") { 
    if($error != NULL) { 
     PyObject *ptype, *pvalue, *ptraceback; 
     PyErr_Fetch(&ptype, &pvalue, &ptraceback); 
     PyErr_Restore(ptype, pvalue, ptraceback); 
     PyErr_Print(); 
     Py_Exit(1); 
    } 
} 
Cuestiones relacionadas