gpt4 book ai didi

c++ - 如何正确使用 BOOST_THROW_EXCEPTION?

转载 作者:行者123 更新时间:2023-11-30 03:26:05 28 4
gpt4 key购买 nike

我尝试使用 boost 异常并失败。有问题代码:

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”。这是意想不到的值(value)。如果我将 BOOST_THROW_EXCEPTION 更改为通常的抛出 - exception_description 值的最后一个字符串看起来是预期的 - “std::exception::what: hello exception

那么如何正确使用BOOST_THROW_EXCEPTION呢?

最佳答案

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

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作为抛出类型的基类,所以您无论如何都不需要自己做——没有任何优势。


其他:

  • 在您的捕获站点使用std::cerr << boost::diagnostic_information(ex) << std::endl;这将打印所有 BOOST_THROW_EXCEPTION 的元数据添加类似:文件、行、函数等
  • 如果你抛出 std::exceptionBOOST_THROW_EXCEPTION()里面你可以包装你的 std::exceptionboost::enable_error_info()将类型更改为 boost::exception这允许您通过 operator<< 使用其他任意字段丰富异常

关于c++ - 如何正确使用 BOOST_THROW_EXCEPTION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48581940/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com