如何在python中捕获异常(在C ++中引起)

时间:2015-09-04 06:35:44

标签: python c++ ctypes

我想在我的C ++应用程序中嵌入python。我没有使用Boost库。

如果C ++函数抛出异常,我想抓住它并在我的应用程序中打印错误或者获取一些详细信息,比如python脚本中导致错误的行号。

我该怎么办?我无法找到任何函数来获取Python API或C ++中的详细异常信息。

void sum(int iA, int iB)
{
    throw iA + iB;
}

from ctypes import * 

mydll = WinDLL("C:\\Users\\cppwrapper.dll")

try:
    mydll.sum(2,3)
catch:
    print "exception occured"

但它不起作用。请帮我解决这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:3)

您需要做的是捕获C ++函数中的异常,然后将其转换为python异常并将其返回到python代码(有关详细信息,请参阅the manual)。类似的东西:

PyObject method(...)
{
     try {
          res = do_stuff();
          return res;
     }
     catch(SomeException e)
     {
          PyErr_SetObject(exception_type, message);
          return NULL;
     }
     catch(...)
     {
          PyErr_SetObject(PyErr_SystemError, "Unexpected exception in C++");
          return NULL;
     }
}

如果在返回python之前没有捕获异常,则异常可能会通过python解释器掉落,并且可能会退出调用python解释器的C ++函数。这可能是处理异常的一种坏方法,因为python解释器无法进行清理。省略号捕获只是为了确保不会发生这种情况。