Estoy implementando un módulo de extensión de Python usando Boost.Python. El módulo debe definir sus propias clases de excepciones personalizadas que heredan Exception
. ¿Cómo puedo hacer eso?Boost.Python clase de excepción personalizada
Respuesta
La siguiente función crea una nueva clase de excepción de Python y la agrega al alcance actual. Si se llama en una función de inicialización del módulo, entonces se agrega al módulo.
El primer argumento es el nombre de la nueva clase de excepción. El segundo argumento es el tipo de objeto para la clase base de la nueva clase de excepción; se predetermina al objeto tipo para Exception
. El valor de retorno es el tipo de objeto para la nueva clase de excepción.
PyObject* createExceptionClass(const char* name, PyObject* baseTypeObj = PyExc_Exception)
{
using std::string;
namespace bp = boost::python;
string scopeName = bp::extract<string>(bp::scope().attr("__name__"));
string qualifiedName0 = scopeName + "." + name;
char* qualifiedName1 = const_cast<char*>(qualifiedName0.c_str());
PyObject* typeObj = PyErr_NewException(qualifiedName1, baseTypeObj, 0);
if(!typeObj) bp::throw_error_already_set();
bp::scope().attr(name) = bp::handle<>(bp::borrowed(typeObj));
return typeObj;
}
utilizar la función de la siguiente manera:
Llame a la función en la función de inicialización del módulo y almacenar el valor devuelto en una variable global: excepción
PyObject* myExceptionTypeObj = 0;
BOOST_PYTHON_MODULE(MyModule)
{
...
myExceptionTypeObj = createExceptionClass("MyException");
...
}
Raise del tipo MyModule.MyException
:
PyErr_SetString(myExceptionTypeObj, "Oh my!")
Diga 'MyException' realmente se asigna a un tipo de C++. ¿Cómo expondría a sus miembros? – Barry
@Kenny:
Si se refiere a
PyErr_SetString(myExceptionTypeObj, "Oh my!")
yo no considerar esto como "la copia de la cadena en un objeto global". Por el contrario, establece el indicador de error interno de Python para que el intérprete genere una instancia de myExceptionTypeObj en su próxima comprobación de indicador de error.
El manejo de excepciones de Python funciona con un indicador de error global (por hilo de Python) y esta es la forma habitual de generar una excepción a través de la API C.
Mi opinión es que estás seguro si tienes el GIL en este momento y causarás una excepción en el subproceso de Python desde el que se ingresó tu código C.
- 1. boost :: python Exportar Excepción personalizada
- 2. C#, Metro Application, clase de excepción personalizada
- 3. PHP excepción personalizada manejo
- 4. Configuración de metaclass de la clase envuelta con Boost.Python
- 5. Boost.Python: Devolución de llamada a funciones de clase
- 6. Boost.Python: Definir un constructor fuera de una clase
- 7. ¿Cómo crear una excepción de C# personalizada?
- 8. ¿Crear excepción personalizada o usar excepciones integradas?
- 9. ¿Excepción estándar o personalizada en C++?
- 10. Excepción de asignación personalizada de Automapper
- 11. PowerShell: Creación de una excepción personalizada
- 12. Verdadero multithreading con boost.python
- 13. ¿Cómo funciona Boost.Python?
- 14. C++ Boost.Python: 2 problemas
- 15. Ninguno en Boost.Python
- 16. Boost.Python y C++ std :: vector de punteros
- 17. Boost.Python - ¿Cómo devolver por referencia?
- 18. ¿Cómo se define la clase de excepción personalizada en Java, de la manera más fácil?
- 19. ¿Cuál es el punto de usar una clase de excepción personalizada en php?
- 20. La exposición de un puntero en Boost.Python
- 21. Agregar información adicional a una excepción personalizada
- 22. Capturar excepción personalizada del servicio web ASMX
- 23. incorrecto señalar su clase - esperando excepción vista de estado en Android 1.5 con pantalla personalizada
- 24. clase fundido excepción
- 25. ¿boost.python no admite el paralelismo?
- 26. Creando una clase sys.stdout personalizada?
- 27. XCode clase personalizada segue atascada
- 28. Definición de excepción personalizada en un módulo de rieles
- 29. json_decode a la clase personalizada
- 30. crear instancias de clase personalizada de NSDictionary
Haga que sus errores hereden de 'Exception'; 'StandardError' es usado por errores generados por herramientas de la biblioteca estándar de python. – Daenyth
@Daenyth: tienes razón. He revisado la pregunta. – user763305