На основе 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++
Программы на C++. Форум разработчиков
-
Anonymous
1748611797
Anonymous
На основе 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>
Подробнее здесь: [url]https://stackoverflow.com/questions/79645525/boostpython-export-custom-exception-2nd-edition[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия