Я пытаюсь использовать boost :: exception, но есть проблема. Я пишу следующий код:
struct BaseExceptionXXX : public virtual std::exception, public virtual boost::exception
{
public:
BaseExceptionXXX()
{ };
virtual ~BaseExceptionXXX() {};
BaseExceptionXXX(char const* const message)
: std::exception(message)
{ }
BaseExceptionXXX(const std::exception& e)
: std::exception(e)
{ }
BaseExceptionXXX(const BaseException& e)
: std::exception(e)
, boost::exception(e)
{ }
bool IsEmpty() const
{
const std::string what_err = std::exception::what();
return (what_err.empty() && boost::get_error_info<UserErrorInfo>(*this) == nullptr);
}
const char* what() const throw() override
{
return boost::diagnostic_information(*this).c_str(); //<-- crash here
}
};int main()
{
std::string exception_description;
try
{
BOOST_THROW_EXCEPTION(BaseExceptionXXX("hello exception"));
}
catch (BaseExceptionXXX& ex)
{
exception_description = ex.what(); //<-- crash here
}
}
Но в функции произошел сбой: boost :: диагностика_информация (* это). Сбой по причине: переполнение стека
Почему это происходит и как правильно использовать boost :: exception?
Буст-версия — 1.66
Версия MSVS2017 — 15.5.5
Вы вызываете переполнение стека из-за бесконечной рекурсии. В вашей реализации what()
ты пишешь:
const char* what() const throw() override
{
return boost::diagnostic_information(*this).c_str(); //<-- crash here
}
Тем не менее, ключевая часть diagnostic_information
Собрано, довольно очевидно, what()
сообщение из исключения. Так, what()
вызовет себя рекурсивно.
Других решений пока нет …