例外処理 (MFC)
このアーティクルでは MFC に用意されている例外処理機構について説明します。 次の 2 つのメカニズムが使用できます:
MFC バージョン 3.0 以降で使用できる C++ 例外
MFC バージョン 1.0 以降で使用できる C++ 例外
MFC で新しいアプリケーションを作成する場合は、C++ メカニズムを使用する必要があります。 既存のアプリケーションで既にこのメカニズムが広範囲に使用されている場合は、マクロベースのメカニズムを使用できます。
MFC 例外マクロの代わりに C++ 例外を使用するために、既存のコードを簡単に変換できます。 コードを変換する利点とこれを行うガイドラインは、例外: MFC 例外マクロからの変換参照してください。
MFC 例外マクロを使用してアプリケーションを既に開発している場合は、新しいコードで C++ 例外を使用しながら、既存のコードでこれらのマクロを引き続き使用できます。 アーティクル例外: バージョン 3.0 における例外マクロの変更点では、これを行うガイドラインを示します。
Note
コードで C++ 例外処理を有効にするには、プロジェクトの [Property Pages (プロパティ ページ)] ダイアログ ボックスの C/C++ フォルダにある [Code Generation (コード生成)] ページで [Enable C++ Exceptions (C++ 例外を有効にする)] を選択するか、/EHsc コンパイラ オプションを使用します。
この記事では、次のトピックについて説明します。
例外処理を使う場合
結果の 3 つのカテゴリは、プログラムの実行中に関数が呼び出された場合に発生する可能性があります。通常の実行、誤った実行、または異常な実行です。 各カテゴリについて以下で説明します。
正常実行
関数が正常に実行され、戻ります。 関数の中には、その関数の結果を示す結果コードを呼び出し元に返すものがあります。 可能な結果コードは、関数に対して厳密に定義され、関数の考えられる結果の範囲を表します。 結果コードは、成功または失敗を示すか、通常の予想の範囲内にある特定の種類のエラーを示すことができます。 たとえば、file-status 関数は、ファイルが存在しないことを示すコードを返す場合があります。 "エラー コード" という用語は使用されません。結果コードは多くの予期される結果の 1 つを表します。
誤った実行
呼び出し側が関数に渡す引数に何らかの不備があるか、不適切なコンテキストで関数を呼び出した場合。 このような状況はエラーの原因となるため、プログラム開発時にアサーションで検出する必要があります。 (アサーションの詳細は、C/C++ アサーションを参照してください。)
異常な実行
異常な実行には、メモリ不足や I/O エラーなど、プログラムの制御外の条件が関数の結果に影響を及ぼしている状況が含まれます。 例外をキャッチしスローして、異常な状況を処理する必要があります。
例外の使用は、異常な実行に特に適しています。
MFC 例外サポート
C++ の例外を直接使用するか、MFC の例外マクロを使用するかにかかわらず、フレームワークまたはアプリケーションによってスローされる可能性がある CException Class または CException
- 派生オブジェクトを使用することになります。
次の表は、MFC によって提供される定義済みの例外を示しています。
例外クラス | 意味 |
---|---|
CMemoryException クラス | メモリ不足 |
CFileException クラス | ファイルの例外 |
CArchiveException クラス | アーカイブ/シリアル化の例外 |
CNotSupportedException クラス | サポートされていないサービス要求への応答 |
CResourceException クラス | Windows リソース割り当て例外 |
CDaoException クラス | データベース例外 (DAO クラス) |
CDBException クラス | データベース例外 (ODBC クラス) |
COleException クラス | OLE 例外 |
COleDispatchException クラス | ディスパッチ (自動化) 例外 |
CUserException クラス | メッセージ ボックスを使用してユーザーに警告し、ジェネリック CException クラスをスローする例外 |
MFC はバージョン 3.0 以降、C++ 例外を使用していますが、フォームの C++ 例外に似た古い例外処理マクロを引き続きサポートします。 これらのマクロは新しいプログラミングで推奨されませんが、下位互換性のために引き続きサポートされます。 既にマクロを使用しているプログラムでは、自由に C++ の例外も使用できます。 プリプロセス時に、Visual C++ Version 2.0 時点では、マクロは C++ 言語の MSVC の実装で定義されている例外処理キーワードに評価されます。 C++ 例外処理の使用を開始するときは、既存の例外処理マクロをそのまま維持できます。 マクロと C++ 例外処理を使用する方法と古いコードを変換して新しいメカニズムを使用する方法については、例外: MFC マクロと C++ の例外の使用、例外: MFC 例外マクロからの変換を参照してください。 以前の MFC 例外マクロを使用している場合、これは C++ の例外のキーワードに評価されます。 例外: Version 3.0 での例外マクロの変更点を参照してください。 構造化例外処理で説明したように、MFC は Windows NT の構造化例外ハンドラ (SEH) を直接サポートしません。
例外に関する詳細な情報
次のアーティクルでは、例外処理に MFC ライブラリを使用する方法について説明します:
次のアーティクルでは、MFC 例外マクロと C++ 例外キーワードを比較し、コードを調整する方法について説明します。