次の方法で共有


MFC での例外処理

この記事では、MFC で使用できる例外処理メカニズムについて説明します。 次の 2 つのメカニズムを使用できます。

  • MFC バージョン 3.0 以降で使用できる C++ 例外

  • MFC バージョン 1.0 以降で使用できる MFC 例外マクロ

MFC を使用して新しいアプリケーションを作成する場合は、C++ メカニズムを使用する必要があります。 既存のアプリケーションで既にそのメカニズムが広範囲に使用されている場合は、マクロ ベースのメカニズムを使用できます。

MFC 例外マクロの代わりに C++ 例外を使用するように、既存のコードを簡単に変換できます。 コードを変換する利点と、コードを変換するためのガイドラインについては、「 例外: MFC 例外マクロからの変換」を参照してください。

MFC 例外マクロを使用してアプリケーションを既に開発している場合は、新しいコードで C++ 例外を使用しながら、既存のコードでこれらのマクロを引き続き使用できます。 例外: バージョン 3.0 での例外マクロの変更に関する記事では、これを行うためのガイドラインが示されています。

コードで C++ 例外処理を有効にするには、プロジェクトの [プロパティ ページ ] ダイアログ ボックスの C/C++ フォルダーにある [コード生成] ページで [C++ 例外を有効にする] を選択するか、 /EHsc コンパイラ オプションを使用します。

この記事では、次のトピックについて説明します。

例外を使用する場合

プログラムの実行中に関数が呼び出されると、通常の実行、誤った実行、または異常な実行の 3 つのカテゴリの結果が発生する可能性があります。 各カテゴリについて以下に説明します。

  • 通常の実行

    関数は正常に実行され、戻る場合があります。 一部の関数は、関数の結果を示す結果コードを呼び出し元に返します。 可能な結果コードは、関数に対して厳密に定義され、関数の可能な結果の範囲を表します。 結果コードは、成功または失敗を示したり、特定の種類の障害が予想される通常の範囲内であることを示したりすることもできます。 たとえば、ファイル状態関数は、ファイルが存在しないことを示すコードを返すことができます。 結果コードは多くの予想される結果の 1 つを表しているため、"エラー コード" という用語は使用されないことに注意してください。

  • 誤った実行

    呼び出し元は、関数に引数を渡すか、不適切なコンテキストで関数を呼び出す際に誤りを犯します。 この状況によりエラーが発生し、プログラムの開発中にアサーションによって検出される必要があります。 (アサーションの詳細については、「 C/C++ アサーション」を参照してください)。

  • 異常な実行

    異常な実行には、メモリ不足や I/O エラーなど、プログラムの制御外の条件が関数の結果に影響を与える状況が含まれます。 異常な状況は、例外をキャッチしてスローすることによって処理する必要があります。

例外の使用は、異常な実行に特に適しています。

MFC 例外のサポート

C++ 例外を直接使用する場合も、MFC 例外マクロを使用する場合でも、フレームワークまたはアプリケーションによってスローされる可能性がある CException クラス または CException派生オブジェクトを使用します。

次の表は、MFC によって提供される定義済みの例外を示しています。

例外クラス 意味
CMemoryException クラス メモリ不足
CFileException クラス ファイルの例外
CArchiveException クラス アーカイブ/シリアル化の例外
CNotSupportedException クラス サポートされていないサービスの要求に対する応答
CResourceException クラス Windows リソース割り当ての例外
CDaoException クラス データベース例外 (DAO クラス)
CDBException クラス データベース例外 (ODBC クラス)
COleException クラス OLE 例外
COleDispatchException クラス ディスパッチ (オートメーション) 例外
CUserException クラス メッセージ ボックスを使用してユーザーに警告し、ジェネリック CException クラスをスローする例外

バージョン 3.0 以降、MFC では C++ 例外が使用されていますが、以前の例外処理マクロは引き続きサポートされています。これは、形式の C++ 例外に似ています。 これらのマクロは新しいプログラミングには推奨されませんが、下位互換性のために引き続きサポートされています。 既にマクロを使用しているプログラムでは、C++ 例外も自由に使用できます。 前処理中、マクロは、Visual C++ バージョン 2.0 の時点で C++ 言語の MSVC 実装で定義されている例外処理キーワードに評価されます。 C++ 例外の使用を開始する間は、既存の例外マクロをそのまま残すことができます。 マクロと C++ 例外処理の混在と、新しいメカニズムを使用する古いコードの変換については、「例外: MFC マクロと C++ 例外と例外の使用: MFC 例外マクロからの変換」を参照してください。 以前の MFC 例外マクロを引き続き使用する場合は、C++ 例外キーワードに評価されます。 「例外: バージョン 3.0 での例外マクロの変更」を参照してください。 MFC は、構造化例外 処理で説明されているように、Windows NT 構造化例外ハンドラー (SEH) を直接サポートしていません。

例外に関するその他の読み取り

次の記事では、MFC ライブラリを使用して例外を処理する方法について説明します。

次の記事では、MFC 例外マクロと C++ 例外キーワードを比較し、コードを調整する方法について説明します。

こちらも参照ください

例外とエラー処理に関する最新の C++ のベスト プラクティス