【发布时间】:2014-11-03 17:46:42
【问题描述】:
Boost Exception 框架很棒。您可以在应用程序的适当级别将信息添加到源自std::exception 和boost::exception 的异常,如in the documentation 所述。
但是如果你不控制代码中的 throw 站点,如何添加这些信息,例如标准库抛出异常,例如地图抛出超出范围?
它不能被捕获为 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,但随后可以添加 no 信息,因为它不是 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 并抛出 boost::exception 的方法之外,还有其他/更好的解决方法,还是我能做的最好的?
-
@JoachimPileborg 也许是可以做他想要的(谁知道)。只是不是他要求的:)
-
好吧,我所要做的就是在发生异常时尽可能多地收集所有不同级别的信息,基本上如 Boost Exception 所述。 @JoachimPileborg 如果您将评论变成答案,我会接受。