【发布时间】:2017-05-08 02:44:27
【问题描述】:
我需要在问题之前给出一些背景信息。请多多包涵。使用 boost::python 我向 Python 公开了一些异常类型,比如MyExceptionType。我有一个boomTest,我将它暴露给 Python 以检查它是否有效。 Python 调用boomTest 并正确处理MyExceptionType,到目前为止一切顺利。这是 C++ 的一面:
static void boomTest() {
throw MyExceptionType("Smoked too many Cohibas!");
}
static PyObject *myExceptionPtr = NULL;
static void translate(MyExceptionType const &exception) {
assert(myExceptionPtr != NULL);
boost::python::object pythonExceptionInstance(exception);
PyErr_SetObject(myExceptionPtr, pythonExceptionInstance.ptr());
}
BOOST_PYTHON_MODULE(test) {
class_<MyExceptionType> myException("MyExceptionType", no_init);
myException.add_property("message", &MyExceptionType::what);
myExceptionPtr = myException.ptr();
register_exception_translator<MyExceptionType>(&translate);
}
这就是 Python 的一面:
import sys
import example
reload(example)
from example import MyExceptionType, boomTest
def tryBoomTest():
try:
boomTest()
except MyExceptionType as ex:
print 'Success! MyExceptionType gracefully handled:' \
'\n message="%s"' % ex.message
except:
print 'Caught unhandled exception: %s "%s"' % (sys.exc_info()[0], sys.exc_info()[1])
现在事情变得有点棘手,因为在一个真实的用例中,我有一个从 C++ Boost(非 Python)线程到 Python 的回调,如下所示:
# this is a Python callback invoked from a C++ boost non-Python thread
def handle(future):
try:
# future.get() throws MyExceptionType if there was a cluster exception
"Cluster response received with value: %s" % future.get()
except MyExceptionType as ex:
print 'Success! MyExceptionType gracefully handled:' \
'\n message="%s"' % ex.message
现在是 OP:
当future.get() 调用抛出一个供Python 处理的MyExceptionType 时,为什么我的C++ 回调触发器会得到一个boost::python::error_already_set 异常?我怀疑这种行为是由于异常是在 C++(非 Python)线程中引发的......
需要什么来强制 Python 像开头的示例那样处理异常?
我已经尝试在 C++ 的回调触发器中执行以下操作:
void callbackTrigger() {
try {
pythonHandle_(getFuture());
}
// why do I get this???
catch (boost::python::error_already_set&) {
// this doesn't help, Python doesn't still handle MyExceptionType
boost::python::handle_exception();
}
}
【问题讨论】:
标签: python c++ exception-handling boost-python