boost::exception和std::exception之间的关系

8
假设有如下代码:
try {
      // Do some boost stuff here
}
catch (const std::exception & stdEx) {
     cout << stdEx.what() << endl;
}

问题:

1) 我知道这段代码适用于某些boost异常,尽管std::exception和boost::exception不在同一个继承路径上。那么为什么它会起作用呢?

2) 这种方式对所有boost异常都有效吗?换句话说,是否有例外情况,当一个位于std::exception处理程序下面的boost::exception处理程序可能被触发时?


不需要深入研究Boost代码,我怀疑它具有条件语句,当在适当的编译器上运行时,会延迟到std版本,因此它们实际上*在同一继承路径中。 - Mark Ransom
1个回答

9
正如你所说,boost::exception并不继承自std::exception。原因请参考相应的FAQ
尽管从基本异常类型派生时应该使用虚继承,但通常异常类型(包括标准库中定义的异常类型)并没有虚继承自std::exception。
如果boost::exception继承自std::exception,则对于这样的用户定义类型使用enable_error_info函数会引入危险的歧义,这将破坏所有catch(std::exception &)语句。
当然,boost::exception不应该用来替换std::exception作为异常类型层次结构中的基础类型。相反,它应该作为虚基类包含在其中,除了std::exception(std::exception可能也应该被虚继承)。

推荐的做法是让特定的boost异常类(virtually)继承自boost::exceptionstd::exception,而不仅仅是继承自boost::exception

一些boost库的异常只继承自std::exception(例如boost::bad_lexical_cast),有些则同时继承自两者(例如boost::xpressive::regex_error)。我不知道有哪个异常只继承自boost::exception,所以我认为只捕获std::exception就可以捕获所有异常。


如果boost :: bad_lexical_cast未派生自boost :: exception,如何解释可以通过(boost :: exception&)捕获它? - James
@James:因为使用了boost::throw_exception来抛出异常,这丰富了异常的内容——其中包括动态添加boost::exception作为基类(更多细节请点击链接)。 - Sander De Dycker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接