给定此代码,其中A
位于第三方库中,B
是我编写的代码:
class A {...};
class B { public: B( const A &a ); ... };
try
{
A a(...);
throw a;
}
catch ( const B &b )
{
// ...do stuff with B, like log the details to a file...
}
如果一个对象A
被抛出,那么我的catch B
被跳过。我希望,因为B
有一个构造函数接受A
对象,这可能工作。
我能做些什么来完成这项工作,或者我必须修改所有catch
子句来处理捕获A
和B
吗?
不行,不行。在将抛出的对象与处理程序进行匹配时,不考虑用户定义的转换。c++ 11标准第15.3/3段:
处理程序匹配
E
类型的异常对象,如果
处理程序的类型是
cv T
或cv T&
,E
和T
是相同的类型(忽略顶级cv-限定符),或者处理程序类型为
cv T
或cv T&
,T
是E
的明确公共基类,或者处理程序的类型为
转换为cv T
或const T&
,其中T
是指针类型,E
是指针类型T
一个标准的指针转换(4.10),不涉及到private或protected指针的转换或歧义类
资质转换
处理程序的类型为
cv T
或const T&
,其中T
是指向成员类型的指针或指针,E
是std::nullptr_t
.