假设有以下代码:
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处理程序?
答案 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::exception
和std::exception
派生(虚拟)特定的提升异常类,而不仅仅是boost::exception
。
某些提升库的异常仅来自std::exception
(如boost::bad_lexical_cast
),其中一些来自(boost::xpressive::regex_error
)。我不知道只有boost::exception
得出的那个,所以我要说只抓std::exception
才能抓住所有。