- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 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::exception
在BOOST_THROW_EXCEPTION()
里面你可以包装你的 std::exception
与 boost::enable_error_info()
将类型更改为 boost::exception
这允许您通过 operator<<
使用其他任意字段丰富异常关于c++ - 如何正确使用 BOOST_THROW_EXCEPTION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48581940/
我尝试使用 boost 异常并失败。有问题代码: struct exception_base : virtual std::exception, virtual boost::exception {
我正在尝试使用 boost::exception 并将我的原型(prototype)代码压缩为 Boost exception tutorial 中的示例但是,当使用 BOOST_THROW_EXCE
我经常最终使用抛出异常的三元组,这可能看起来有点奇怪但在初始化列表中节省了一天(因此有助于编写合理的构造函数,因此有助于 RAII,...)。例如。如果参数 a是 smart_ptr<>我们想要非 n
如何使用 BOOST_THROW_EXCEPTION 宏?什么作为参数?我不知道,我似乎找不到任何可读的例子。 最佳答案 您只需将一个异常对象传递给它: BOOST_THROW_EXCEPTION(s
我使用的是 boost 1.53.0,到目前为止没有遇到任何问题(并且使用了套接字、定时器、容器、算法,都没有问题)。 我喜欢使用 boost 异常的想法,尤其是因为行号等等。 但是,在我的( sup
我是一名优秀的程序员,十分优秀!