3

鉴于此代码,在A第 3 方库中的位置,并且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跳过 my 。我希望因为B有一个接受A对象的构造函数,这可能会起作用。

我可以做些什么来完成这项工作,还是我必须修改所有catch子句来处理同时捕获Aand B

4

1 回答 1

9

不,那行不通。将抛出的对象与处理程序匹配时,不考虑用户定义的转换。根据 C++11 标准的第 15.3/3 段:

处理程序是匹配异常对象的类型E,如果

  • 处理程序的类型是cv Torcv T&并且是相同ET类型(忽略顶级 cv 限定符),或者

  • 处理程序的类型是cv Torcv T&并且T是 的明确公共基类E, 或

  • 处理程序是 typecv Tconst T&whereT是指针类型,并且E是可以T由两者之一或两者转换为的指针类型

    • 标准指针转换 (4.10) 不涉及到指向私有或受保护或不明确类的指针的转换

    • 资格转换

  • 处理程序是 typecv Tconst T&whereT是指针或指向成员类型的指针,并且Estd::nullptr_t.

于 2013-05-01T20:19:13.633 回答