例外
読み:れいがい
外語:exception
プログラム
の実行において、正常な実行過程に含まれない事象のこと。
目次
例外の例
ファイルシステム
システム例外
バグに起因するもの
MPUの例外
処理方法
概要
言語処理
技術
x86
例外の例
ファイルシステム
ファイル
を読み込む時に、ファイルが無いか、アクセス権限がない
記憶容量不足により書き込みができない
ファイルシステム
に書き込む時に、ファイルへのアクセス権限がない
ハードウェア異常
ファイルシステム、ハードウェアの仕様を超える操作
システム例外
ヒープメモリー確保失敗
I/Oエラー
スタックオーバーフロー
バッファーオーバーフロー
C
などでは、バッファーオーバーフローが発生しても例外を発生させず、
強制終了
もしない。これが数々の
セキュリティホール
を生んだ。
バグに起因するもの
0除算
ぬるぽ
MPUの例外
書込み禁止に指定した
メモリー
に書き込もうとした
マイクロプロセッサーの命令として不正なものが与えられた(無効命令例外)
仮想記憶のページングに失敗
x86
シリーズでの例外は後述する。
処理方法
概要
例外は、それまでの処理の続行が不可能になった条件でのみ発生する。
そのため、例外が発生した場合は何らかの後始末が必要になる。この後始末のことを
例外処理
と呼ぶ。
軽微な例外であれば
プログラム
や
オペレーティングシステム
(OS)が例外処理でその例外をリカバリすることも可能だが、致命的な例外の場合は
プロセス
、OS、ハードウェアを停止させる必要が出てくることもある。
言語処理
多くのプログラミング言語において、例外のための機構が用意されている。
Java
、
C++
、
C#
、Visual Basic .NETの
try
〜
catch
構文、古典的
BASIC
のON ERROR GOTOなどが代表的である。
技術
x86
x86
シリーズで発生する例外は、次の通りである。
なお、例外の後の二桁の数値は16進数であり、また名称は
Microsoft Windows
で使用されているものである。
例外00 (除算違反)
プロセッサーで
0除算例外
が発生した場合に、この例外が返される。
例えば
0除算
が試みられた場合、演算結果が出力オペランドに適合しない場合、などがある。
例外01 (デバッガー違反)
ブレークポイントやタスク切り替えトラップ等を検知した場合に返される。
例外02 (NMI割り込み)
ハードウェアのマスク不可割り込み(
NMI
)で使用される。
例外03 (ブレークポイントトラップ)
デバッガーが設定したブレークポイントによって発生する。
例外04 (オーバーフロートラップ)
EFLAGS
のOF(オーバーフローフラグ)が1の時にINTO命令が実行された場合に発生する。
例外05 (境界チェック違反)
BOUND命令のインデックスが範囲外の場合に発生する。
例外06 (無効なオペコード違反)
無効な命令を実行しようとした時に発生する。
例外07 (コプロセッサ利用不可違反)
数値演算コプロセッサーが搭載されていないにも関わらず、浮動少数点型命令が実行された場合に発生する。
例外08 (ダブル フォールト)
例外エラー例外処理中に、別の例外が発生すると、この例外が発生する。
例外09 (コプロセッサ セグメント オーバーラン)
浮動小数点命令で、セグメントの終了位置を超えてメモリーアクセスが発生すると、この例外が発生する。
逆に浮動小数点オペランドの開始アドレスがセグメント外の場合は、一般保護違反になる。
例外0A (無効なタスク状態セグメント)
タスクステートセグメント(TSS)内の何らかのディスクリプター情報が無効であると、この例外が発生する。
例外0B (不在違反)
オペレーティングシステムで仮想記憶機能を使用時、「不在」とマークされたセグメントに対しアクセスされた場合に、この例外が発生する。
例外0C (スタック違反)
命令が、スタックセグメントの制限を超えるメモリーを参照すると、この例外が発生する。
例外0D (
一般保護違反
)
他の例外に該当しない状態となると、この例外が発生する。
通常、そのプログラムは
強制終了
させられる。
例外0E (
ページ違反
)
「不在」に設定されたページにアクセスが発生したときに、この例外が発生する。
例外0F
将来用の予約。
例外10 (コプロセッサ エラー)
浮動小数点演算コプロセッサーにアクセスできない場合に、この例外が発生する。
例外11 (アライメント チェック違反)
i486以降のプロテクトモードで、アライメントが必要な命令でアライメントされていな場合に、この例外が発生する。
再検索