例外処理
例外処理の最新ニュースをまとめて検索!
例外処理(れいがいしょり)とは、プログラムがある処理を実行している途中で、なんらかの異常が発生した場合に、現在の処理を中断(中止)して、別の処理を行うこと。その際に発生した異常のことを例外と呼ぶ。
何を持って「異常」とするかは様々であるが、次のようなものが挙げられる。
- ハードウェアの故障
- オペレーティングシステム等、システムの設定ミス
- ライブラリの欠損
- ユーザの入力間違い
- 数値入力を要求している場合での、英単語の入力
- 存在しないファイルの指定
- 許されない演算(0での除算や実数演算で解が虚数になる演算など)
- 割り当てられていない記憶領域へのアクセス
- 不正な値が与えられたポインタで参照する、或いは機械語レベルで不正な値が与えられたインデックスレジスタ等を用いてメモリ参照することとなった場合
- ページフォールト
- オブジェクト指向言語において、オブジェクトとして定義されていないポインタ(ヌルポインタ)をオブジェクトとして取扱おうとした場合(NullPointerException)。
[編集] 言語サポート
幾つかのプログラミング言語では組み込みの例外処理機能を用意している。例えばAda、C++、Java、C#、JavaScript、OCamlがそうである。これらの言語では専用の言語機能によってプログラマが例外処理を記述する手間を軽減している。
例外が発生したことを見落として正常時の動作を継続してしまうと、より深刻・致命的な異常を招くおそれがある。それを避けるには例外が発生したことのチェックを綿密に行い、例外が検出された場合には適切な事後処理を行う他ない。しかし、大規模なプログラムではこのようなチェックは膨大なものとなり、本来目的としている正常時の処理よりも多くの記述を必要とする場合すらある。
そこで、これらの言語では例外の発生チェックをほぼ自動化している。例外が発生すると現在の処理を中断する。発生した例外の事後処理を担当できるハンドラを探して次々にコールスタック(関数呼び出し)を遡り、適切なハンドラを見つけるとそれに事後処理を任せる。これにより、遡る途中にあったこの例外を処理する能力を持たない処理は自動的に中断されることになる。
Scheme では言語レベルでの例外処理を持たないが、これは継続が存在するため例外をライブラリレベルで実現できるからである(標準仕様であるSRFI-34で定義されている)。
[編集] 戻り値と例外
例外処理(例外オブジェクト)をサポートしないCなどの言語では、従来から関数(サブルーチン)の戻り値によってその関数(処理)の成否を判定する方法がとられてきた。慣例的に、関数の戻り値を32bit整数値などで宣言して、関数が成功した場合は0を返し、失敗した場合はエラーコードとして何らかの負数を返すことが多い。そして、各エラーコードによって失敗の原因を定義しておき、呼び出し側で原因を判定する。このような戻り値による処理の成否判定には下記のような問題点がある。
- 戻り値は無視できるため、呼び出し先でエラーが発生しても通常通り処理を継続するプログラムを記述できてしまう。
- エラーコードはたいてい32bitの整数値でしかないため、それ以上の詳細な情報(例えばエラーメッセージ)を付加することができない。
- 戻り値を毎回チェックする判定文を記述するのが煩雑である。
言語レベルでの例外処理はこれらの欠点を解消し、エラーを確実に、かつ統一的に処理する目的で導入されたものと言える。
[編集] 関連項目
最終更新 2009年11月3日 (火) 03:32 (日時は個人設定で未設定ならばUTC)。
【例外処理】変更履歴

