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

Jam*_*mes 4 c++ boost exception-handling

假设有以下代码:

try {
      // Do some boost stuff here
}
catch (const std::exception & stdEx) {
     cout << stdEx.what() << endl;
}
Run Code Online (Sandbox Code Playgroud)

问题:

1)我知道代码适用于一些boost异常,即使std :: exception和boost :: exception不在同一个继承路径上.为什么它会起作用呢?

2)它是否适用于所有增强异常?换句话说,是否有例子可以触发低于std :: exception处理程序的boost :: exception处理程序?

San*_*ker 6

正如你所说,boost::exception并非来自std::exception.因此,请查看相应的常见问题解答:

尽管应该在从基本异常类型派生时使用虚拟继承,但通常异常类型(包括标准库中定义的类型)并非std::exception虚拟派生.

如果boost::exception派生自std::exception,使用enable_error_info具有此类用户定义类型的函数会引入危险的歧义,这会破坏所有catch(std::exception &)语句.

当然,boost::exception不应该std::exception在异常类型层次结构中将其替换为基类型.相反,它应该作为虚拟基础包含在内std::exception(除了应该也可以虚拟地派生).

建议是有特定的升压异常类从两个派生(几乎)boost::exceptionstd::exception,和而不仅仅是boost::exception.

一些提升库的异常仅来自std::exception(例如boost::bad_lexical_cast),一些来自两者(例如boost::xpressive::regex_error).我不知道那个只是从那里得到的boost::exception,所以我会说捕捉就std::exception应该抓住所有.