Ctypes捕获异常

时间:2012-04-16 14:11:25

标签: python c++ ctypes

我正在玩ctypes和C / C ++ DLL 我有一个非常简单的“数学”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 个答案:

答案 0 :(得分:1)

首先,您不应该在C ++中使用异常规范。这是C ++的一个可怕特性,它已被最新标准弃用。此外,语法throw(...)根本不是有效的C ++,这行不能使用标准的编译器编译,如gcc:

double Divide(double a, double b) throw (...)

我认为你依赖的是非标准的Visual C ++“扩展”,据我所知,无论如何都是无用的,因为Visual C ++会忽略所有异常规范,除非throw()没有参数。

通过Python 2.7.3的ctypes文档,我看不到任何对C ++的引用,也没有从ctypes调用的C ++代码中抛出异常。似乎ctypes仅用于调用C函数,不处理C ++异常。

答案 1 :(得分: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"