如何正确使用BOOST_THROW_EXCEPTION?

时间:2018-02-02 11:39:48

标签: c++ c++11 boost boost-exception

我尝试使用提升异常并拒绝。 有问题代码:

struct exception_base : virtual std::exception, virtual boost::exception 
{
    exception_base(std::exception&& e)
        : std::exception(e)
    {}
};

int main()
{
    std::string exception_description;

    try
    {
        BOOST_THROW_EXCEPTION(exception_base(std::runtime_error("hello exception")));
    }
    catch (exception_base& ex)
    {
        exception_description = boost::diagnostic_information(ex);
    }

    return 0;
}

在这种情况下,exception_description的值具有最后一个字符串 - “ std :: exception :: what:Unknown exception ”。这是意想不到的价值。如果我将BOOST_THROW_EXCEPTION更改为常规throw - 看起来是期望的最后一个exception_description值字符串 - “ std :: exception :: what:hello exception

那么如何正确使用BOOST_THROW_EXCEPTION?

1 个答案:

答案 0 :(得分:1)

您的自定义异常类不是必需的,也是您遇到问题的根本原因。如果你删除它,你可以这样做:

BOOST_THROW_EXCEPTION(std::runtime_error("hello exception"));

然后:

catch (const std::exception& ex)

代码将以您期望的方式运行。

为什么之前没有工作?好吧,您的exception_base类没有存储错误消息,因此当您从std::exception构建它时,它无法存储消息(例如,来自原始runtime_error)。

您可以通过许多不同的方式修复它,但最终它们将归结为同样的事情:如果您希望自定义异常类包含消息字符串,它必须以某种方式包含该消息字符串。

我很高兴95%的时间没有定义自定义异常类型,因此我建议您保持简单并使用runtime_error(和/或logic_error )。

请注意,BOOST_THROW_EXCEPTION会自动添加boost::exception作为抛出类型的基类,因此您无需自行执行此操作 - 没有优势。