我尝试使用提升异常并拒绝。 有问题代码:
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?
答案 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
作为抛出类型的基类,因此您无需自行执行此操作 - 没有优势。