2012-04-16 107 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