你能通过转换运算符的类型捕获异常吗?

时间:2010-02-26 16:46:33

标签: c++ exception-handling conversion-operator

我不知道如何在一个简短的主题行中很好地表达这个问题,所以让我尝试更长的解释。假设我有这些异常类:

class ExceptionTypeA : public std::runtime_error
{
    // stuff
};

class ExceptionTypeB : public std::runtime_error
{
    // stuff

    operator ExceptionTypeA() const; // conversion operator to ExceptionTypeA
};

我可以这样做,让它触发catch块吗?

try
{
    throw ExceptionTypeB();
}
catch (ExceptionTypeA& a)
{
    // will this be triggered?
}

我猜它不会,这是不幸的,但我想我会问,因为我无法在网上或SO上找到任何信息。是的,我意识到我可以在我的编译器中运行程序,看看会发生什么,但这不会告诉我标准对这种行为的说法,只是我的编译器实现的(我不相信它)。 / p>

1 个答案:

答案 0 :(得分:15)

你做不到。标准为15.3/3

  

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

     
      
  • 处理程序的类型为cv Tcv T&,而E和T的类型相同(忽略顶级cv-   限定词),或
  •   
  • 处理程序的类型为cv Tcv T&,T是E的明确公共基类,或
  •   
  • 处理程序的类型为cv1 T* cv2,E是指针类型,可以转换为处理程序的类型   通过其中一个或两个      
        
    • 标准指针转换(4.10),不涉及到私有或受保护或指针的转换   模糊的课程
    •   
    • 资格转换
    •   
  •   

您想要的方案与这些都不匹配。 cv表示“const和/或volatile组合”