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

时间:2014-11-18 16:08:42

标签: c++ boost exception-handling

假设有以下代码:

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

问题:

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

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

1 个答案:

答案 0 :(得分:6)

正如您所说,boost::exception并非来自std::exception。因此,请检查相应的FAQ

  

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

     

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

     

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

recommendation是要从boost::exceptionstd::exception派生(虚拟)特定的提升异常类,而不仅仅是boost::exception

某些提升库的异常仅来自std::exception(如boost::bad_lexical_cast),其中一些来自(boost::xpressive::regex_error)。我不知道只有boost::exception得出的那个,所以我要说只抓std::exception才能抓住所有。