Python Director 类中的 Swig 异常
Swig exception in Python director class
我在Python中使用Swig控制器包装了一些类。 我的每个类方法都返回一个 MyError 类。发生的情况是,一旦我从我的一个C++派生了一个 python 类,我忘记返回 MyError() 对象,但我返回的"pass"都没有,或者我忘记返回任何内容,我的软件在 MyError 类的默认构造函数中崩溃通过读取访问冲突,并且我无法通过 try/catch 块跟踪此异常。
在Swig中处理这种情况的正确方法是什么?
谢谢!
第 36.5.4 节 SWIG 文档中出现的异常:
对于控制器将方法调用路由到 Python,以及代理将它们路由到 C++,异常的处理是一个重要的问题。默认情况下,控制器忽略在 Python 中解析的方法调用期间发生的异常。为了正确处理此类异常,有必要暂时将它们转换为C++异常。这可以通过 %feature("director:except") 指令来完成。在大多数情况下,以下代码就足够了:
%feature("director:except") {
if ($error != NULL) {
throw Swig::DirectorMethodException();
}
}
此代码将在每次从控制器调用到 Python 的方法后检查 Python 错误状态,并在发生错误时引发C++异常。可以在C++捕获此异常以实现错误处理程序。目前,Swig::D irectorMethodException对象中没有有关Python错误的信息,但将来可能会发生变化。
可能是方法调用源自 Python,通过代理类最多传输到 C++,然后通过 Director 方法返回到 Python。如果此时 Python 中发生异常,最好让该异常找到返回到原始调用方的方式。这可以通过将普通的 %exception 指令与上面显示的 director:except 处理程序相结合来完成。下面是一个合适的异常处理程序的示例:
%exception {
try { $action }
catch (Swig::DirectorException &e) { SWIG_fail; }
}
此示例中使用的类 Swig::D irectorException 实际上是 Swig::D irectorMethodException 的基类,因此它将捕获此异常。由于抛出 Swig::D irectorMethodException 时仍会设置 Python 错误状态,因此 Python 将在 C 包装函数返回后立即注册异常。
例
下面是说明该技术的示例test.i
:
%module test
%module(directors="1") test
%feature("director");
%feature("director:except") {
if ($error != NULL) {
throw Swig::DirectorMethodException();
}
}
%exception {
try { $action }
catch (Swig::DirectorException &e) { SWIG_fail; }
}
%inline %{
class MyError {
int m_n;
public:
MyError(int n = 0) : m_n(n) {}
~MyError() {}
int get() const { return m_n; }
};
class Demo {
public:
Demo() {}
virtual ~Demo() {}
virtual MyError test() { return MyError(5); }
};
int func(Demo* d) { return d->test().get(); }
%}
滑动和编译后,演示:
>>> import test
>>> d=test.Demo() # default class implementation
>>> test.func(d) # Call virtual method in a C++ test function.
5
以上工作正常。 下面覆盖不正确:
>>> class Demo2(test.Demo): # New class
... def test(self): # Override virtual function
... return 7 # But don't return a MyError object.
...
>>> d=Demo2()
>>> test.func(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: SWIG director type mismatch in output value of type 'MyError'
这捕获了异常并返回了一个有用的异常。 以下正确覆盖:
>>> class Demo2(test.Demo):
... def test(self):
... return test.MyError(7)
...
>>> d=Demo2()
>>> test.func(d)
7
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- Python 3.7 和 excess_args 的 SWIG 问题
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- Python Director 类中的 Swig 异常
- SWIG生成的代码未处理或引发异常
- SWIG生成的java代码不能在64位Solaris上处理异常
- 使用SWIG对java进行类型映射异常,仍然没有被捕获
- SWIG类型映射中的c++异常
- 使用SWIG动态地将自定义C++异常重新考虑为Python异常
- SWIG:重用选择性异常处理程序
- 为什么我丢失异常与SWIG, c++, python