鉴于此代码,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
?
答案 0 :(得分:9)
不,那不行。将抛出的对象与处理程序匹配时,不会考虑用户定义的转换。根据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),不涉及转换为私有或受保护的指针 或模糊的课程
资格转换
处理程序的类型为
cv T
或const T&
,其中T
是指向成员类型的指针或指针,E
是std::nullptr_t
。