Почему произошел сбой boost :: диагностика_информация и как это исправить?

Я пытаюсь использовать 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

1

Решение

Вы вызываете переполнение стека из-за бесконечной рекурсии. В вашей реализации what() ты пишешь:

const char* what() const throw() override
{
return boost::diagnostic_information(*this).c_str(); //<-- crash here
}

Тем не менее, ключевая часть diagnostic_information Собрано, довольно очевидно, what() сообщение из исключения. Так, what() вызовет себя рекурсивно.

1

Другие решения

Других решений пока нет …