当函数的异常规范具有基类型时,函数是否可以抛出派生类异常?

时间:2011-02-04 10:14:15

标签: c++

我有以下代码。

class Base{};
class Derived: public Base{};

class Test
{
public:
    void fun() throw(Base)
    {
        throw Derived();
    }
};

int main()
{
    Test ob; ob.fun();
}

函数fun()可以在其异常规范列表具有基类型时抛出派生类型的异常吗?

4 个答案:

答案 0 :(得分:3)

由于Derived来自Base,因此技术上是-a Base。所以,是的,如果您的方法签名列出了它们的基类型,您可以抛出派生的异常类型。

但请注意,正如@MSalters所说,issues有异常规范。

答案 1 :(得分:3)

简短的回答是,是的,可以,更长的一个: 不要使用函数异常规范。在新的标准C ++ 0x中,它将被弃用。

为什么他们弃用它?因为在C ++中异常规范不像java那样工作。如果你试图抛出别的东西,你就不会得到任何编译错误(比如在java中)。在运行时,它将调用std::unexpected()函数,该函数将调用意外的处理函数,默认情况下将终止程序。

答案 2 :(得分:1)

是的,没关系。如果类型E的异常规范包含类型T,则类型T的处理程序将匹配类型E的异常,则该函数允许类型{{1}}的异常(C ++)标准2003,15.4)

答案 3 :(得分:0)

这是绝对正确的。当然可以,你可以通过ref(到基类)捕获异常并重新抛出它,例如。

//..
try
{
    ob.fun();
}
catch( Base& ex )
{
    // do something with the exception;

    // throw;  // if you want it to be re-thrown
}