In Java exception specification is a mandatory part of method declaration. In C++ exception specification is optional. When it is used, the behaviour is different, than in Java.
class E1;
class E2;
void f() throw(E1) // throws only E1 or subclasses
{
...
throw E1(); // throws exception of type E1
...
throw E2(); // calls unexpected() which calls terminate()
}
// same as:
void f()
try {
...
}
catch(E1) { throw; }
catch(...) { std::unexpected(); }
//============================================
class E1;
class E2;
void f() throw(E1,std::bad_exception) // throws only E1 or subclasses
{ // or bad_exception
...
throw E1(); // throws exception of type E1
...
throw E2(); // calls unexpected() which throws bad_exception
}
typedef void (*unexpected_handler)();
unexpected_handler set_unexpected(unexpected_handler);
typedef void (*terminate_handler)();
terminate_handler set_terminate(terminate_handler);
// terminate() by default calls abort()
void f() throw() { } // can improve efficiency
//=============================================
~T::T()
{
if ( ! uncaught_exception() )
{
// code that could throw...
}
else
{
// code must not throw
}
}