看C++源码时发现,定义某些函数时会在后面加 throw(),如:
inline HBITMAP CImage::Detach() throw()
其实,这是函数提供者和使用者的一种君子协定,标明该函数不抛出任何异常,所以在使用该函数时,不必把它置于 try/catch 异常处理块中。
声明一个不抛出异常的函数后,你有责任保证在你的函数的实现里面不会抛出异常。
void A::func() throw() { // 程序会在这里崩溃.(如果该异常被处理,不会崩溃) throw (5); }
编译器不会认为上面的代码存在错误(vc2005会给出警告:warning C4297: “func”: 假定函数不引发异常,但确实发生了),但是,如果该异常未被上层的异常过滤器捕捉的话,会引发运行时的错误。
综上述:
1) 函数后面声明 throw() 只是接口的提供者和接口的使用者间的默契或称协议。
2) 如果内部直接throw something,编译器会发现并指出;
3) 如果是内部调用了一个可能throw something的函数,编译器无法发现,运行时一旦这个内部的函数throw,程序会abort。
同理, 函数后面可以跟上 throw (type),表示该函数可能会抛出指定 type 类型的异常,而不是别的类型的异常。
- func() throw(type) ,会抛出某种异常
- func() throw(),不会抛出异常
- func() throw(...),可能是任何类型的异常