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

Sté*_*ane 3 c++ exception try-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...
}
Run Code Online (Sandbox Code Playgroud)

如果A抛出一个对象,则catch B跳过我的.我希望B有一个构造函数来获取一个A对象,这可能会起作用.

有什么我可以做的工作,或者我必须修改所有catch条款来处理捕获AB

And*_*owl 9

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

处理程序是类型为Eif 的异常对象的匹配项

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

  • 处理程序是类型cv Tcv T&,T是一个明确的公共基类E,或

  • 处理程序是类型cv Tconst T&其中T是指针类型,并且E是可以T通过其中一个或两个转换为的指针类型

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

    • 资格转换

  • 该处理程序的类型为cv Tconst T&其中T是一个指针或指针构件类型和Estd::nullptr_t.