На основе Boost 1.88.0, Boost :: Python Export Custort Exception и связанные дискуссии Я использую следующее, чтобы выявить пользовательский C ++ std :: Exception for Python. < /p>
class cException : public std::exception
{
private:
const std::string m_message;
const int m_code;
public:
cException(const std::string &message, const int &code = -1);
virtual ~cException() throw();
const std::string &message() const;
const int &code() const;
};
template
class exception_ : public boost::python::class_
{
private:
std::string m_exc_name;
public:
template
exception_(char const* excName, ExceptionBaseType excBaseType) : boost::python::class_(excName, boost::python::no_init), m_exc_name(excName)
{
PyObject* excType = PyErr_NewException((std::string(boost::python::extract(boost::python::scope().attr("__name__"))) + std::string(".") + this->m_exc_name).c_str(), excBaseType, 0);
boost::python::scope().attr(this->m_exc_name.c_str()) = boost::python::handle(boost::python::borrowed(excType));
boost::python::register_exception_translator(
[ptr=excType](const ExceptionCustomType& e) {
boost::python::object excObj(boost::python::handle(boost::python::borrowed(ptr)));
excObj.attr("__repr__") = boost::python::str(e.message());
excObj.attr("code") = boost::python::object(e.code());
PyErr_SetString(ptr, e.message().c_str());
PyErr_SetObject(ptr, boost::python::object(e).ptr());
});
}
};
BOOST_PYTHON_MODULE(MyModule)
{
exception_("MyCustomException", PyExc_BaseException)
;
}
< /code>
в Python, тогда это работает так: < /p>
import MyModule
try:
MyModule.throw()
except MyModule.MyCustomException as e:
print("REPR = ", e.__repr__)
print("CODE = ", e.code)
< /code>
Но мне не нравится, что атрибуты «__repr__» и «код» устанавливаются в register_exception_translator.
Я бы предпочел установить их в само определение исключения Python. Например, < /p>
BOOST_PYTHON_MODULE(MODULENAME)
{
exception_("MyCustomException", PyExc_BaseException)
.add_property("__repr__", &cException::message)
.add_property("code", &cException::code)
.def("some_additional_fancy_method", &cException::some_additional_fancy_method)
;
}
< /code>
Я не смог реализовать это до сих пор.
Кто -нибудь, кто больше знаком с Boost :: Python, знает, можно ли это реализовать вообще или как? < /p>
Подробнее здесь: https://stackoverflow.com/questions/796 ... nd-edition
Boost :: Python - Export Custom Exception (2 -е издание) ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Изучение Python с
книгой 4 -е издание, но нужно установить политику выполнения
Anonymous » » в форуме Python - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-