豚吐露@wiki
try~catchで例外が捕捉できない
最終更新:
ohden
-
view
try~catchで例外が捕捉できない
WindowsXP SP3
Visual C++ 2008
Visual C++ 2008
C++には例外が2種類ある。
- 構造化例外
- ソフトウェア例外
VCでアプリケーションを作った場合、デフォルトではソフトウェア例外しかcatchできない。
構造化例外をcatchするには『__try~__except()』を用いるか、コンパイラオプションに『/EHa』を指定する。
- 『__try~__except()』の使い方
例を参考。__exceptの括弧内には以下の3つが入る。
EXCEPTION_EXECUTE_HANDLER (1) | 発生した例外を当該関数内で処理する場合 |
EXCEPTION_CONTINUE_SEARCH (0) | 発生した例外をそのままthrowして呼び出し元関数に返す場合 |
EXCEPTION_CONTINUE_EXECUTION (-1) | 例外発生箇所から処理を継続する場合 |
e.g.)
__try{
}
__except (EXCEPTION_EXECUTE_HANDLER){
}
__try{
}
__except (EXCEPTION_EXECUTE_HANDLER){
}
- 『/EHa』の設定方法
対象のプロジェクトのプロパティから[構成プロパティ]-[C/C++]-[コード生成]を選択。
右側に『C++ の例外を有効にする』という項目がある。
選択肢には以下の4つがあり、デフォルトで『はい (/EHsc)』が選択されている。
■いいえ
■はい (/EHsc)
■はい - SEH の例外あり (/EHa)
■<親またはプロジェクトの既定値から継承>
これを『はい - SEH の例外あり (/EHa)』に変更すれば、構造化例外もcatchできるようになる。
右側に『C++ の例外を有効にする』という項目がある。
選択肢には以下の4つがあり、デフォルトで『はい (/EHsc)』が選択されている。
■いいえ
■はい (/EHsc)
■はい - SEH の例外あり (/EHa)
■<親またはプロジェクトの既定値から継承>
これを『はい - SEH の例外あり (/EHa)』に変更すれば、構造化例外もcatchできるようになる。
ちなみに、コレVisual Studio 2005からの仕様みたい。
Visual Studio 2003 .Netでは『/EHsc』がデフォルトで、普通に0除算で発生する例外もcatchできた。構造化例外という考え方自体がVS2005からのものなのかな?
Visual Studio 2003 .Netでは『/EHsc』がデフォルトで、普通に0除算で発生する例外もcatchできた。構造化例外という考え方自体がVS2005からのものなのかな?
普通に作られてりゃ問題無いと思うが、変に例外処理に頼った処理をしとるアプリケーションをVS2003からVS2005以降に移植する時は例外処理に対するコンパイラオプションに注意する必要があるかもしれん。
VS2008でしか試しとらんが、VS2010以降でもこの仕様のままなんかね?(-ω-;)
VS2008でしか試しとらんが、VS2010以降でもこの仕様のままなんかね?(-ω-;)
更新日: 2012年10月02日 (火) 18時45分09秒