c++ - 如何使用 boost 异常将信息添加到 std::exception

标签 c++ exception boost

Boost Exception 框架很棒。您可以在应用程序的适当级别向从 std::exceptionboost::exception 派生的异常添加信息,如 in the documentation 所述。 .

但是如果你不控制代码中的throw site,怎么能添加这样的信息,e.g.标准库抛出异常,例如 map 抛出超出范围?

不能被捕获为 boost::exception,因为它不是从它派生的:

try {
  my_map.at(id);
} catch(boost::exception &e) { // NOT caught
  e << errinfo_desc("id not found, map out of range");
  throw;
}

它可以作为 std::exception 被捕获,因为 out_of_range 派生自 std::exception,但是 没有信息可以被添加,因为它不是 boost::exception :

try {
  my_map.at(id);
} catch(std::exception &e) {
  // compile error: e << errinfo_desc("id not found, map out of range"); 
  throw;
}

捕获 std::exception 并抛出一个新的 boost::exception 丢失不需要的异常的原始位置:

try {
  my_map.at(id);
} catch(std::exception &e) {
  BOOST_THROW_EXCEPTION(my_exception() 
                        << errinfo_desc("id not found, map out of range")); 
}

是否可以保留原始异常及其位置等,并且以后仍然能够添加更多信息?怎么办?

最佳答案

就个人而言,我尽可能使用 std::exception 层次结构。当它们不够用时,我就从 std::exception 派生我的异常类。从未有过 boost::exception 的用例(也许我所有的代码都太简单了,不知道)。

但是如果你真的想把两者结合起来,这是一个疯狂的想法:使用多重继承。代码草图(未经测试,更像是伪代码):

// two personalities in one exception object
class MyException: public std::exception, public boost::exception {
  explicit MyException(const std::exception& stdex) { ... }
  ... other ctors as needed...

  ... other stuff ...
};

...

try {
  my_map.at(id);
} catch (const std::exception& stdex) {
  MyException myex(stdex); // gets SOME of the std::exception information
  myex << errinfo_desc("id not found, map out of range"); // boost::exception goodies
  throw myex;
}

明显的警告:使用 std::exception 引用初始化 MyException 对象时出现切片问题。以及 MI 的常见问题。您已被警告 :-)

关于c++ - 如何使用 boost 异常将信息添加到 std::exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25759293/

相关文章:

c++ - 调用虚拟方法而不是派生方法

java - 如何阅读 NumberFormatException 错误信息?

java - 如何捕获Java中Catch block 中发生的异常

c++ - Boost.Coroutine 和 Boost.Coroutine2 的区别

c++ - R6010 使用时出错; std::stoi

c++ - 通过引用传递父对象

c++ - 确定两个字符串是否相差一个字符的最快方法

php - Symfony\组件\HttpKernel\异常\NotFoundHttpException : object not found

c++ - Boost GIL 图像构造函数

boost::spirit::karma 输出引号内的字符串