例外処理 (MFC)Exception Handling in MFC

この記事では、MFC で使用できる例外処理機構について説明します。This article explains the exception-handling mechanisms available in MFC. 次の2つのメカニズムを使用できます。Two mechanisms are available:

  • C++ 例外 (MFC バージョン3.0 以降で使用可能)C++ exceptions, available in MFC version 3.0 and later

  • Mfc バージョン1.0 以降で使用できる MFC 例外マクロThe MFC exception macros, available in MFC versions 1.0 and later

MFC を使用して新しいアプリケーションを作成する場合は、C++ の機構を使用する必要があります。If you're writing a new application using MFC, you should use the C++ mechanism. 既存のアプリケーションで既にこのメカニズムが広く使用されている場合は、マクロベースのメカニズムを使用できます。You can use the macro-based mechanism if your existing application already uses that mechanism extensively.

MFC 例外マクロではなく、C++ 例外を使用するように既存のコードを簡単に変換できます。You can readily convert existing code to use C++ exceptions instead of the MFC exception macros. コードを変換する場合の利点と、そのためのガイドラインについては、「 例外: MFC 例外マクロからの変換」を参照してください。Advantages of converting your code and guidelines for doing so are described in the article Exceptions: Converting from MFC Exception Macros.

MFC 例外マクロを使用して既にアプリケーションを開発している場合は、新しいコードで C++ 例外を使用しながら、既存のコードでこれらのマクロを使用し続けることができます。If you have already developed an application using the MFC exception macros, you can continue using these macros in your existing code, while using C++ exceptions in your new code. 例外: バージョン3.0 での例外マクロの変更」で は、そのためのガイドラインが提供されています。The article Exceptions: Changes to Exception Macros in Version 3.0 gives guidelines for doing so.

注意

コードで C++ 例外処理を有効にするには、プロジェクトの [ プロパティページ ] ダイアログボックスの [C/c + +] フォルダーにある [コード生成] ページで [C++ 例外を有効にする] を選択するか、 /ehsc コンパイラオプションを使用します。To enable C++ exception handling in your code, select Enable C++ Exceptions on the Code Generation page in the C/C++ folder of the project's Property Pages dialog box, or use the /EHsc compiler option.

この記事では、次のトピックについて説明します。This article covers the following topics:

例外を使用する場合When to Use Exceptions

プログラムの実行中に関数が呼び出されると、通常の実行、エラーの発生、または異常な実行の3つのカテゴリの結果が発生する可能性があります。Three categories of outcomes can occur when a function is called during program execution: normal execution, erroneous execution, or abnormal execution. 各カテゴリについて以下に説明します。Each category is described below.

  • 通常の実行Normal execution

    関数は正常に実行され、を返します。The function may execute normally and return. 一部の関数は、結果コードを呼び出し元に返します。これは、関数の結果を示します。Some functions return a result code to the caller, which indicates the outcome of the function. 有効な結果コードは関数に対して厳密に定義され、関数の結果の範囲を表します。The possible result codes are strictly defined for the function and represent the range of possible outcomes of the function. 結果コードは、成功または失敗を示すことも、通常の期待範囲内にある特定の種類の障害を示すこともできます。The result code can indicate success or failure or can even indicate a particular type of failure that is within the normal range of expectations. たとえば、ファイル状態関数は、ファイルが存在しないことを示すコードを返すことができます。For example, a file-status function can return a code that indicates that the file does not exist. 結果コードは多くの予期される結果の1つを表すため、"エラーコード" という用語は使用されないことに注意してください。Note that the term "error code" is not used because a result code represents one of many expected outcomes.

  • 間違った実行Erroneous execution

    呼び出し元が関数に引数を渡すとき、または不適切なコンテキストで関数を呼び出すと、何らかの誤りが発生します。The caller makes some mistake in passing arguments to the function or calls the function in an inappropriate context. このような状況ではエラーが発生し、プログラムの開発中にアサーションによって検出される必要があります。This situation causes an error, and it should be detected by an assertion during program development. (アサーションの詳細については、「 C/c + + アサーション」を参照してください)。(For more information on assertions, see C/C++ Assertions.)

  • 異常な実行Abnormal execution

    通常とは異なる実行には、メモリ不足や i/o エラーなど、プログラムの制御外の条件が関数の結果に影響を与える状況が含まれます。Abnormal execution includes situations where conditions outside the program's control, such as low memory or I/O errors, are influencing the outcome of the function. 異常な状況は、例外をキャッチしてスローすることによって処理する必要があります。Abnormal situations should be handled by catching and throwing exceptions.

例外の使用は、特に異常な実行に適しています。Using exceptions is especially appropriate for abnormal execution.

MFC 例外サポートMFC Exception Support

C++ 例外を直接使用するか、MFC 例外マクロを使用するかにかかわらず、フレームワークまたはアプリケーションによってスローされる可能性のある CException クラス または派生オブジェクトを使用し CException ます。Whether you use the C++ exceptions directly or use the MFC exception macros, you will use CException Class or CException-derived objects that may be thrown by the framework or by your application.

次の表は、MFC によって提供される定義済みの例外を示しています。The following table shows the predefined exceptions provided by MFC.

例外クラスException class 説明Meaning
CMemoryException クラスCMemoryException Class メモリ不足Out-of-memory
CFileException クラスCFileException Class ファイルの例外File exception
Cアーカイブ例外クラスCArchiveException Class アーカイブ/シリアル化の例外Archive/Serialization exception
CNotSupportedException クラスCNotSupportedException Class サポートされていないサービスに対する要求への応答Response to request for unsupported service
CResourceException クラスCResourceException Class Windows リソース割り当ての例外Windows resource allocation exception
CDaoException クラスCDaoException Class データベースの例外 (DAO クラス)Database exceptions (DAO classes)
CDBException クラスCDBException Class データベースの例外 (ODBC クラス)Database exceptions (ODBC classes)
COleException クラスCOleException Class OLE 例外OLE exceptions
COleDispatchException クラスCOleDispatchException Class ディスパッチ (オートメーション) の例外Dispatch (automation) exceptions
CUserException クラスCUserException Class メッセージボックスを使用してユーザーに警告し、汎用CException クラスをスローする例外Exception that alerts the user with a message box, then throws a generic CException Class

MFC はバージョン 3.0 以降、C++ 例外を使用していますが、フォームの C++ 例外に似た古い例外処理マクロを引き続きサポートします。Since version 3.0, MFC has used C++ exceptions but still supports its older exception handling macros, which are similar to C++ exceptions in form. これらのマクロは新しいプログラミングで推奨されませんが、下位互換性のために引き続きサポートされます。Although these macros are not recommended for new programming, they are still supported for backward compatibility. 既にマクロを使用しているプログラムでは、自由に C++ の例外も使用できます。In programs that already use the macros, you can freely use C++ exceptions as well. プリプロセスの実行中、マクロは Visual C++ バージョン2.0 のように C++ 言語の MSVC 実装で定義されている例外処理キーワードに評価されます。During preprocessing, the macros evaluate to the exception handling keywords defined in the MSVC implementation of the C++ language as of Visual C++ version 2.0. C++ 例外処理の使用を開始するときは、既存の例外処理マクロをそのまま維持できます。You can leave existing exception macros in place while you begin to use C++ exceptions. マクロと C++ 例外処理の組み合わせ、および新しい機構を使用するように古いコードを変換する方法の詳細については、「 例外: Mfc マクロと C++ 例外の使用 」と「 例外: mfc 例外マクロからの変換」を参照してください。For information on mixing macros and C++ exception handling and on converting old code to use the new mechanism, see the articles Exceptions: Using MFC Macros and C++ Exceptions and Exceptions: Converting from MFC Exception Macros. 以前の MFC 例外マクロを使用している場合、これは C++ の例外のキーワードに評価されます。The older MFC exception macros, if you still use them, evaluate to C++ exception keywords. 例外: バージョン3.0 での例外マクロの変更点」を参照してください。See Exceptions: Changes to Exception Macros in Version 3.0. MFC では、「 構造化例外処理」で説明されているように、Windows NT 構造化例外ハンドラー (SEH) を直接サポートしていません。MFC does not directly support Windows NT structured exception handlers (SEH), as discussed in Structured Exception Handling.

例外に関する参考資料Further Reading About Exceptions

次の記事では、MFC ライブラリを使用して例外を処理する方法について説明します。The following articles explain using the MFC library for exception handing:

次の記事では、MFC 例外マクロと C++ 例外キーワードを比較し、コードをどのように調整できるかを説明します。The following articles compare the MFC exception macros with the C++ exception keywords and explain how you can adapt your code:

関連項目See also

例外とエラー処理に関する最新の C++ のベストプラクティスModern C++ best practices for exceptions and error handling