可以将catch()编写为从一种对象类型转换为另一种对象类型



给定此代码,其中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子句来处理捕获AB吗?

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

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

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

  • 处理程序类型为cv Tcv T&, TE的明确公共基类,或者

  • 处理程序的类型为cv Tconst T&,其中T是指针类型,E是指针类型

    转换为T
    • 一个标准的指针转换(4.10),不涉及到private或protected指针的转换或歧义类

    • 资质转换

  • 处理程序的类型为cv Tconst T&,其中T是指向成员类型的指针或指针,Estd::nullptr_t .

相关内容

最新更新