Ctypes 捕获异常

4
我正在使用ctypes和C/C++ DLLs进行一些小的实验。我有一个非常简单的数学dll。
double Divide(double a, double b)
{
    if (b == 0)
    {
       throw new invalid_argument("b cannot be zero!");
    }

    return a / b;
}

到目前为止,它运行良好。唯一的问题是,我在Python中遇到了WindowsError异常,无法检索文本 b不能为零。是否需要抛出某些特殊的异常类型?还是必须修改Python代码? Python代码:

from ctypes import *

mathdll=cdll.MathFuncsDll
divide = mathdll.Divide
divide.restype = c_double
divide.argtypes = [c_double, c_double]

try:
    print divide (10,0)
except WindowsError:
    print "lalal"
except:
    print "dada"
2个回答

2

浏览Python 2.7.3的ctypes文档时,我没有看到任何有关通过ctypes调用的C++代码中抛出异常的参考。似乎ctypes仅用于调用C函数,不处理C++异常。


我正在尝试使用throw标签进行实验,看看它是否会改变行为...那么我应该如何处理异常? - nobs
你可以做的一件事是放弃使用异常来向Python代码传递错误信息,而是使用另一个输出参数返回错误代码。我知道这不太优雅...另一个选择是使用Swig,它对处理异常有很好的支持,或者使用Boost.Python。 - piokuc

0

试试这个:

from ctypes import *

mathdll=cdll.MathFuncsDll
divide = mathdll.Divide
divide.restype = c_double
divide.argtypes = [c_double, c_double]

try:
    print divide (10,0)
except WindowsError as we:
    print we.args[0]
except:
    print "Unhandled Exception"

请注意:如果未正确捕获C++异常,Python解释器将终止。它不会自动转换为Python异常。Python在抛出异常的函数调用中永远不会返回,因此无法通过 try/except 结构来捕获它。 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接