1

我尝试使用提升异常和下降。有问题代码:

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 更改为通常的抛出 - exception_description 值的最后一个字符串看起来是预期的 - “ std::exception::what: hello exception

那么如何正确使用 BOOST_THROW_EXCEPTION 呢?

4

1 回答 1

2

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

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

然后:

catch (const std::exception& ex)

并且代码将按照您期望的方式工作。

为什么它以前不起作用?好吧,您的exception_base类没有存储错误消息的空间,因此当您从 a 构造它时,std::exception它无法存储消息(例如,来自原始的runtime_error)。

你可以用很多不同的方法来修复它,但最终它们会归结为同一件事:如果你希望你的自定义异常类包含一个消息字符串,它必须以某种方式包含那个消息字符串。

我喜欢在 95% 的时间里不定义自定义异常类型,所以我建议你保持简单并使用runtime_error(和/或logic_error)。

请注意,它会BOOST_THROW_EXCEPTION自动添加boost::exception为抛出类型的基类,因此您无论如何都不需要自己这样做——没有任何优势。

于 2018-02-02T12:00:59.163 回答