2012-07-12 198 views

回答

2

Jim Bosch在C++-sig list上提出的一个可行解决方案是使用组合而不是从包装的C++异常继承。代码必须像here那样创建Python异常,然后将包装的C++异常添加为Python异常的实例变量。

void translator(const MyCPPException &x) { 
    bp::object exc(x); // wrap the C++ exception 

    bp::object exc_t(bp::handle<>(bp::borrowed(exceptionType))); 
    exc_t.attr("cause") = exc; // add the wrapped exception to the Python exception 

    PyErr_SetString(exceptionType, x.what()); 
} 

包裹的C++异常然后可以从Python的访问这样的:

try: 
    ... 
except MyModule.MyCPPExceptionType as e: 
    cause = e.cause # wrapped exception can be accessed here 

但异常还将由

try: 
    ... 
except Exception: 
    ... 
+1

注意,'exc_t.attr(“原因被捕获“)= exc;'将C++异常实例作为属性添加到Python异常*类*中。因此,如果您在Python中捕获了一个异常实例e1并保留对它的引用,那么第二次引发这种C++异常将会改变e1的cause属性来引用新的C++异常实例。 – Holger 2015-04-24 09:24:38