Boost Exception 框架很棒。您可以在应用程序的适当级别向从 std::exception
和 boost::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/