2006-12-09

Subroutine exeception with throw.

今天看代码是发现了这个问题,以前不知道有这种异常处理法.学海无涯呀.......

函数声明与throw

例如:
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()。这曾经让我很恼火,认为这种机制形同虚设,但是还是有些解决的办法,3.3 每个函数后面都要写throw()? 尽管前面已经分析了这样做也有漏洞,但是它仍然是一个好习惯,可以让调用者从头文件得到非常明确的信息,而不用翻那些可能与代码不同步的文档。

没有评论: