Я обернул C ++ и пользовательский класс исполнения, как описано в ответе на вопрос: Как распространить исключения C ++ в Python в библиотеке-обертке SWIG?
Используя мой класс в Python, вызов функции, которая генерирует исключение и перехватывает исключение, приводит к следующей ошибке:
Traceback (most recent call last):
File "../WrapperTester/src/main.py", line 17, in <module>
ret = cow.milkCow()
File "..\WrapperTester\src\CowLib\CowLib.py", line 115, in milkCow
return _CowLib.Cow_milkCow(self)
src.CowLib.CowLib.CowException: None
Это мой заголовок класса C ++, включая исключение:
class CowException {
private:
std::string message = "";
public:
CowException(std::string msg);
~CowException() {};
std::string what();
};
class _Cow
{
private:
int milk;
int hunger;
public:
_Cow();
~_Cow();
int milkCow() throw(CowException);
void feed(int food) throw(CowException);
};
И мой заголовок SWIG:
%module CowLib
%include "exception.i"
%include "Cow.i"
%{
#define SWIG_FILE_WITH_INIT
#include "Cow.h"
#include "_Cow.h"
static PyObject* pCowException;
%}
%init %{
pCowException = PyErr_NewException("_CowLib.CowException", NULL, NULL);
Py_INCREF(pCowException);
PyModule_AddObject(m, "CowException", pCowException);
%}
%exception Cow::milkCow {
try {
$action
} catch (CowException &e) {
PyErr_SetString(pCowException, e.what().c_str());
SWIG_fail;
}
}
%exception Cow::feed {
try {
$action
} catch (CowException &e) {
PyErr_SetString(pCowException, e.what().c_str());
SWIG_fail;
}
}
%include "_Cow.h"
%pythoncode %{
CowException = _CowLib.CowException
%}
Где заголовок «Cow.i» является «стандартным» SWIG-заголовком:
%module Cow
%{
#include "_Cow.h"
#include "Cow.h"
%}
%include "Cow.h"