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

时间:2013-05-01 20:16:40

标签: 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...
}

如果抛出了对象A,则会跳过catch B。我希望B有一个带A对象的构造函数,这可能会有效。

我可以做些什么来使这项工作,或者我是否必须修改所有catch条款以处理AB

1 个答案:

答案 0 :(得分:9)

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

  

如果

,则处理程序匹配E类型的异常对象      
      
  • 处理程序类型为cv Tcv T&ET属于同一类型(忽略顶级cv限定符),   或

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

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

    之一或两者转换为T      
        
    • 标准指针转换(4.10),不涉及转换为私有或受保护的指针   或模糊的课程

    •   
    • 资格转换

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

  •