関数宣言には、例外指定を 1 つ含めることができます。例外指定とは、関数が直接的にまたは間接的に送出する可能性のある例外のことです。
次の 2 つの宣言は、関数 f1 は例外を生成し、その例外は X 型のハンドラが受け取ることおよび、型 W、Y、または Z のハンドラによって捕獲できる例外だけを関数 f2 が生成することを伝えています。
void f1(int) throw(X); void f2(int) throw(W,Y,Z);
void f3(int) throw(); // 空の括弧
このように定義すると、関数 f3 は例外を 1 つも生成しなくなります。例外指定で許可されていない例外によって関数が終了する場合、事前に定義済みの関数 unexpected() が呼び出されます。unexpected() は、デフォルトで abort() を呼び出してプログラムを終了します。set_unexpected() 関数を呼び出すと、このデフォルトの動作を変えることができます。「terminate() と unexpected() 関数の変更」を参照してください。
予期しない例外は、コンパイル時ではなくプログラムの実行時に検査されます。許可されていない例外が送出されそうな場合でも、実行時にその例外が実際に送出されないかぎりエラーは出力されません。
しかしコンパイラは、場合によっては不必要な検査を省くことができます。
void foo(int) throw(x); void f(int) throw(x); { foo(13); }
例外を指定しておかないと、あらゆる例外が送出される可能性があります。