A function can specify explicitly what type of exception it may throw. An exception specification, however, is not checked at compile time, but rather at run time:
class X {};int f(); // no exception specification, can throw any type of exceptionvoid g(int j) throw(); // promises not to throw any exception at all{ int result = f(); // if f throws an exception, g will violate its guarantee not to throw an exception //still, this is a perfectly legal code}
There are several reasons for this runtime checking policy. In the example, f could be a legacy C function. It is impossible to force a C function to have an exception specification. Also, forcing the programmer to write unnecessary try/catch blocks in g (although f doesn’t throw any exception at all) is an unacceptable burden. For these reasons, an exception specification is checked at run time.