void foo() throw (int); // 只能抛出int型异常 void bar() throw (); // 不抛出任何异常 void baz(); // 可以抛出任意类型的异常或者不抛出异常
如果一个函数的声明中带有throw限定符,则在函数体中也必须同样出现:
void foo() throw (int) { ... }
这里有一个问题,非常隐蔽,就是即使你象上面一样编写了foo()函数,指定它只能抛出int异常,而实际上它还是可能抛出其他类型的异常而不被编译器发现:
void foo() throw (int) { throw float; // 错误!异常类型错误!会被编译器指出 ... baz(); // 正确!baz()可能抛出非int异常而编译器又不能发现! }
void baz() { throw float; }
这种情况的直接后果就是如果baz()抛出了异常,而调用foo()的代码又严格遵守foo()的声明来编写,那么程序将abort()。这曾经让我很恼火,认为这种机制形同虚设,但是还是有些解决的办法,请参照“使用技巧”中相关的问题。
|