我有以下代码。
class Base{};
class Derived: public Base{};
class Test
{
public:
void fun() throw(Base)
{
throw Derived();
}
};
int main()
{
Test ob; ob.fun();
}
函数fun()可以在其异常规范列表具有基类型时抛出派生类型的异常吗?
答案 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
}