【C++语法】C ++ 函数后面加 throw() 的作用

看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(...),可能是任何类型的异常
原文地址:https://www.cnblogs.com/SchrodingerDoggy/p/14281144.html