Вопрос по ctypes, c++, python – Ctypes ловить исключение

3

Я немного играю с ctypes и C / C ++ DLL У меня довольно простая «математика» длл

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

    return a / b;
}
</code>

Пока работает единственная проблема, я получаю исключение WindowsError в Python, и я не могу получить текст b cannot be zero Есть ли какой-то особый тип исключения, который я должен выбросить? Или код Python должен быть изменен? код Python:

<code>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"
</code>

Ваш Ответ

2   ответа
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"
Я получаю код исключения 0xe06d7363 nobs
1

Прежде всего, вы не должны использовать спецификации исключений в C ++. Это ужасная особенность C ++, и она устарела в последнем стандарте. Также синтаксисthrow(...) вообще не является допустимым C ++, эта строка не компилируется стандартным компилятором, таким как gcc:

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

Я думаю, что вы полагаетесь на нестандартное расширение Visual C ++, которое, насколько я знаю, в любом случае бесполезно, потому что Visual C ++ игнорирует все спецификации исключений, если толькоthrow() не имеет аргументов

Просматривая документацию ctypes для Python 2.7.3, я не вижу никаких ссылок на C ++ и выдачи исключений из кода C ++, вызываемого через ctypes. Кажется, что ctypes предназначен только для вызова функций C и не обрабатывает исключения C ++.

Я играл с меткой броска, пытаясь изменить что-то в поведении ... так как мне обрабатывать исключения? nobs
Вы можете отказаться от использования исключений для сообщения об ошибках в коде Python; вместо этого используйте другой параметр out для возврата кода ошибки. Не очень элегантно, я знаю ... Другой вариант - использовать Swig, он имеет хорошую поддержку для обработки исключений или Boost.Python.

Похожие вопросы