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

Relationship between boost::exception and std::exception

本文关键字:exception 关系 之间 boost std      更新时间:2023-10-16

假设有以下代码:

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

问题:

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

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

正如你所说,boost::exception不是从std::exception派生出来的。出于原因,请查看相应的常见问题解答:

尽管在从基本异常类型派生

时应使用虚拟继承,但通常异常类型(包括标准库中定义的异常类型)不会从虚拟std::exception派生。

如果boost::exception派生自std::exception,将enable_error_info函数与这样的用户定义类型一起使用会引入危险的歧义,从而破坏所有catch(std::exception &)语句。

当然,boost::exception 不应用于将 std::exception 替换为异常类型层次结构中的基类型。相反,除了std::exception之外,它还应该作为虚拟基础包含在内(可能也应该以虚拟方式派生)。

建议让特定的 boost 异常类(虚拟地)从 boost::exceptionstd::exception 派生,而不仅仅是从 boost::exception 派生。

一些 boost 库的异常仅来自std::exception(如 boost::bad_lexical_cast),一些来自两者(如boost::xpressive::regex_error)。我不知道有哪一种只来自boost::exception,所以我会说只捕捉std::exception应该抓住所有。