例外ハンドラを実装する場合の基本作業を次に示します。
他の多くの関数から呼び出されている関数は、エラーが検出されるたびに例外が送出されるようコーディングしてください。通常、この throw 式はオブジェクトを 1 つ送出します。このオブジェクトは、例外の型を識別し、送出された例外に関する固有の情報を渡す際に使用します。
その関数を使用するプログラム中で try 文を使用して例外に備えてください。例外が発生すると思われる関数呼び出しを try ブロック内で中括弧で囲んでください。
try ブロックのすぐ後に、catch ブロックを 1 つ以上記述してください。 各 catch ブロックは、受け取ることのできるオブジェクトの型またはクラスを識別します。オブジェクトが例外によって送出されると、次のことが行われます。
例外により送出されるオブジェクトが catch 式の型と一致する場合は、この catch ブロックに制御が移ります。
例外により送出されるオブジェクトが先頭の catch ブロックと一致しない場合は、以降の catch ブロックから、型の一致するものが順次検索されます。
try ブロックが入れ子になっていて 1 つも一致するものがない場合は、最も内側にあるcatch ブロックから、try ブロックの外側にある一番近い catch ブロックに制御が移ります。
現在の関数内に一致する catch ブロックが見つからない場合は、現在の関数内の 「自動」 (局所的で非静的) オブジェクトはすべて破壊され、関数はただちに終了します。一致するcatch ブロックの検索は、現在の関数を呼び出した関数により継続して行われます。この処理は、関数 main に達するまで継続されます。
どの catch ブロックとも一致しない場合は、プログラムは事前定義済みの関数 terminate() を呼び出して正常終了します。terminate() はデフォルトで abort() を呼び出し、abort() は残っているオブジェクトをすべて破壊してプログラムを終了します。set_terminate() 関数を呼び出すと、このデフォルトの動作を変えることができます。
例外処理は、配列の範囲検査などの同期例外だけをサポートするように設計されています。同期例外という言葉は、例外が throw 式からのみ発生することを意味します。
C++ 標準では、終端モデルを使用した同期例外処理をサポートしています。終端とは、一度例外が送出されたらその場所には制御が戻らないことを意味します。
例外処理は、キーボード割り込みなどの非同期例外を直接処理するようには設計されていません。ただし、注意して行えば、非同期イベントの場合にも動作するように設定することもできます。たとえば、例外処理をシグナルと一緒に動作させるには、大域変数を設定し、この変数の値を定期的な間隔でポーリングして値が変化したときに例外を送出するようなシグナルハンドラを作成します。