Не выводится местоположение броска (Boost.Exception) - PullRequest
1 голос
/ 06 января 2020

Возникли проблемы при создании исключения с использованием Boost.Exception. 8444950934950830985903859380958309850938905839859080985098940689089689028

class BOOST_SYMBOL_VISIBLE base_exception : virtual public std::exception, virtual public boost::exception
{
public:
    base_exception()
    : std::exception(),
      boost::exception(),
      context_(0)
    {
    }

    base_exception(const char* context)
    : std::exception(),
      boost::exception(),
      context_(context)
    {
    }

    virtual ~base_exception() BOOST_NOEXCEPT_OR_NOTHROW
    {
    }

protected:
    const char* context_;
};

class BOOST_SYMBOL_VISIBLE my_exception : public virtual base_exception
{
public:
    my_exception(const char* context)
       : base_exception(context)
    {
    }

    my_exception(const my_exception& other)
       : base_exception(other)
    {
    }

    virtual char const* what() const BOOST_NOEXCEPT_OR_NOTHROW
    {
        return "my exception";
    }

    virtual ~my_exception() BOOST_NOEXCEPT_OR_NOTHROW
    {
    }
};

BOOST_NORETURN void throw_exception(const base_exception& ex)
{
    BOOST_THROW_EXCEPTION(ex << boost::errinfo_api_function("api_1"));
}

BOOST_NORETURN void throw_exception(const my_exception& ex)
{
    BOOST_THROW_EXCEPTION(ex << boost::errinfo_api_function("api_2"));
}

int main(void) {
    try{
        throw_exception(my_exception("context"));
    }catch(...)
    {
        cerr << boost::current_exception_diagnostic_information();
    }
    return 0;
}

Результатом этой программы будет:

Throw location unknown (consider using BOOST_THROW_EXCEPTION)
Dynamic exception type: boost::wrapexcept<my_exception>
std::exception::what: my exception

Но если изменить это исключение my_exception * base_exception

.../main.cpp(59): Throw in function void throw_exception(const base_exception &)
Dynamic exception type: boost::wrapexcept<base_exception>
std::exception::what: std::exception
[boost::errinfo_api_function_*] = api_1
BST, BOOX, EXT, B0000 * * * BST *, 10000 *

BST, 10000 * * BST, 10000 * BST причина исключения? Как исправить этот код?

...