例外処理 (MFC)
ここでは、MFC の例外処理機構について説明します。次の 2 つの機構があります。
MFC 3.0 以降で使用できる C++ 例外処理機構
MFC 1.0 以降で使用できるマクロ ベースの例外処理機構
MFC を使用するプログラムを新規作成する場合は、新しい C++ 例外処理機構を使ってください。既存のプログラムでマクロ ベースの例外処理機構が広範に使われている場合は、引き続きマクロ ベースの例外処理機構を使うことができます。
既存のプログラムで使っているマクロ ベースの例外処理は、簡単に C++ 例外処理に変換できます。コードを変換した場合の利点と、変換のガイドラインについては、「例外処理 : 古いコードの変換」を参照してください。
また、既存のプログラムでこれらのマクロを使っている部分はそのまま利用し、新規に付け加えた部分で C++ 例外処理を使うこともできます。この場合のガイドラインについては、「例外処理 : MFC 3.0 での変更点」を参照してください。
[!メモ]
プログラムで C++ 例外処理機構を有効にするには、プロジェクトの [プロパティ ページ (C++)] ダイアログ ボックスの [C/C++] フォルダーで、[コード生成] ページの [C++ の例外を有効にする] チェック ボックスをオンにします。または、/GX コンパイラ オプションを使います。既定は /GX- (例外処理を無効にする) です。
ここでは、次のトピックについて説明します。
例外処理を使う場合
MFC の例外処理のサポート
例外処理関連項目
例外処理を使う場合
プログラム実行中の関数の呼び出し結果には、正常実行、エラー実行、異常実行の 3 種類があります。次に、それぞれの内容を示します。
正常実行
関数は正常に実行され、呼び出し元に戻ります。関数の実行結果を示す結果コードが呼び出し側に返される場合もあります。結果コードの値は関数ごとに厳密に定義されており、予測される実行結果に対応付けられています。結果コードでは、成功または失敗を報告するばかりでなく、通常の予測範囲内で発生した一種の失敗を示すこともできます。たとえば、ファイルの状態を示す関数で、ファイルが存在しないことを示す結果コードを返すことができます。結果コードはいずれかの予測結果を示すものなので、"エラー コード" という用語は使用しません。
エラー実行
呼び出し側が関数に誤った引数を引き渡したとき、または関数を不適切なコンテキストで呼び出したときに、この実行結果が生じます。この場合はエラーになるので、プログラムの開発中にアサーション チェックによって検出する必要があります。アサーションの詳細については、「アサーション」を参照してください。
異常実行
メモリ不足や入出力エラーなど、プログラムで制御できない条件が発生し、関数の実行結果に影響が及ぶ場合は、異常実行と判定されます。この場合は、例外のスローとキャッチによって異常事態に対処する必要があります。
例外処理は、特に異常実行に向いた処理方式です。
MFC の例外処理のサポート
C++ 例外処理機構を直接使用する場合も、MFC 例外処理マクロを使用する場合も、CException クラス クラスまたは CException クラスのオブジェクトを使います。これらのオブジェクトは、フレームワークまたはユーザー プログラムによってスローされます。
MFC には、次の表にあるような定義済みの例外が用意されています。
例外クラス |
説明 |
---|---|
メモリ不足例外 |
|
ファイル例外 |
|
アーカイブ/シリアル化例外 |
|
サポートされていないサービスを要求されたときの応答 |
|
Windows リソース割り当て例外 |
|
データベース例外 (DAO クラス) |
|
データベース例外 (ODBC クラス) |
|
OLE 例外 |
|
ディスパッチ (オートメーション) 例外 |
|
メッセージ ボックスでユーザーに警告を与えてから汎用 CException クラス をスローする例外 |
[!メモ]
MFC は、C++ 例外処理と MFC 例外マクロをサポートしていますが、Windows NT の構造化例外ハンドラー (SEH: Structured Exception Handler) は直接にはサポートしていません (「構造化例外処理」を参照)。
例外処理関連項目
以下の項では、MFC ライブラリの例外処理機構について説明しています。
以下の項では、MFC 3.0 とそれ以前のバージョンの違いについて説明しています。新しい C++ 例外を古いコードと共存させる方法についても説明しています。