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コードを変更する必要がありますか?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

これを試して:

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 に答える
1

まず第一に、C++では例外仕様を使用しないでください。これはC++の恐ろしい機能であり、最新の標準では非推奨になっています。また、構文throw(...)はC ++ではまったく有効ではありません。この行は、gccなどの標準準拠のコンパイラではコンパイルされません。

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

非標準のVisualC++の「拡張機能」に依存していると思います。これは、私が知る限り、とにかく役に立たないthrow()ため、引数がない場合を除き、VisualC++はすべての例外仕様を無視します。

Python 2.7.3のctypesドキュメントを確認すると、C ++への参照が表示されず、ctypesを介して呼び出されたC++コードから例外がスローされます。ctypesはC関数を呼び出すためだけのものであり、C++例外を処理しないようです。

于 2012-04-16T16:49:10.640 に答える