例外処理は,プログラム実行中に発生しうる不測の事態(例外)に対処するための処理のことです。

 例えば,ある関数(あるいはメソッド,以下同)内で例外が発生したときの対処方法として,関数の返り値として例外の種類に応じた値を返す方法があります。関数の呼び出し元は,関数の返り値をチェックすることによって,例外の種類に応じた処理を行うわけです。

 この方法はわかりやすいのですが,あらゆる例外に対処しようとすると,関数の呼び出し元で返り値をチェックするためのコードが煩雑になるという問題点があります。チェックのためのコード量がプログラム本来の処理以上にふくれ上がり,プログラムの見通しが悪くなることもしばしばです。

 そこで,最近のプログラム言語の多くは,例外処理を簡潔に記述できる「構造化例外処理(SEH:Structured Exception Handling)」の機能を備えています。関数には,不測の事態が起こったときには「例外オブジェクト」を生成することで外部に例外の発生を知らせる仕組みを作り込んでおきます。

 例えば,C++,Java,C#などは,try,catch,finallyという三つのキーワードを使った構文で構造化例外処理を記述できます。

 まず,例外が発生する可能性があるコードをtryブロックでくくって記述します。正常に処理が進めばそのままtryブロックを抜けます。一方,tryブロックのどこかで例外が発生すると,その時点でtryブロック内の処理は中断し,制御がcatchブロックに移ります。

 catchブロックは,tryブロック内のいずれかのコードが生成した例外オブジェクトを引数として受け取り,発生した例外の種類に応じて対処します。例外が発生しなければ処理は正常に終了したと見なせるので,例外の発生をいちいちチェックしたり,対処するためのコードを大幅に削減できます。

 finallyブロックはあってもなくてもよく,tryブロックの処理が正常に終了するか,あるいはtryブロックで例外が発生してcatchブロックの処理が終わるかした後に実行されます。例えば,tryブロック内にファイルを開く処理がある場合,そのファイルを閉じる処理をfinallyブロックに記述すれば,例外が発生してもしなくても,最後に必ずファイルを閉じる処理が実行されます。


出典:2006年12月号 132ページより 日経ソフトウエア
記事は執筆時の情報に基づいており、現在では異なる場合があります。