2012-04-16 162 views
3

我打得有点用的ctypes和C/C++的DLL 我有一个非常简单的“数学” DLLctypes的捕捉异常

double Divide(double a, double b) 
{ 
    if (b == 0) 
    { 
     throw new invalid_argument("b cannot be zero!"); 
    } 

    return a/b; 
} 

它的工作原理至今 唯一的问题,我得到一个WindowsError Python中的例外,我无法检索文本 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" 

回答

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++异常。

+0

我被扔标签 想,如果它的行为改变的东西...... 所以我应该怎么处理异常玩耍? – nobs 2012-04-17 08:58:03

+0

你可以做的一件事就是放弃使用异常来将错误传递给Python代码;而是使用另一个输出参数来返回错误代码。不是很优雅,我知道......另一种选择是使用Swig,它对处理异常或Boost.Python有很好的支持。 – piokuc 2012-04-17 09:26:06

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" 
+0

我收到 异常代码0xe06d7363 – nobs 2012-04-16 14:51:32