VC++での例外処理

VC++には2種類の例外が存在する。

  • 構造化例外(Windows固有の例外 SEH : Structured Exception Handling )
  • C++例外

の2つである。


構造化例外
構造化例外を捕捉するにはVC++独自拡張である__try{}__except(){}構文を用いる。
__try{}__except(){}以外に__try{}__finally{}なども用意されている。
この例外を処理することでアクセスバイオレーションなどのRuntimeエラーを検出することができる。
明示的に例外を発生するにはAPIのRaiseExceptionを呼び出す。


C++例外
C++例外はそのままなので説明は省略。
C++例外で構造化例外を捕捉するにはcatch(...)とすれば良い。

VC++には構造化例外をC++例外に変換するための機構が用意されている。
_set_se_translatorというCRTの関数を呼び出すことで
構造化例外をC++例外にラップするための変換関数が呼び出されるようになる。
ただし、マルチスレッド例外を考慮する必要がある。
詳しくはMSDNのコラムDeep C++の例外処理を参照すると良い。

Deep C++(日本語版)
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndeepc/htm/deep060399.asp


IDEの機能を使う
コードを用いずに例外を捕捉するにはVC++デバッグ設定で例外を捕捉するように設定する。
デフォルトでは構造化例外やC++例外は捕捉されない設定になっている。
VC2005EEではメニューの「デバッグ」->「例外」から設定を行うことが出来る。
例外を捕捉する設定にすることで、例外発生直後にブレークを行うようになる。