4

我正在玩一点 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 代码?蟒蛇代码:

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"
4

2 回答 2

1

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

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

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

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

于 2012-04-16T16:49:10.640 回答
1

尝试这个:

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"
于 2012-04-16T14:15:47.073 回答