次の方法で共有


CException クラス

MFC (Microsoft Foundation Class) ライブラリ内のすべての例外に関する基底クラスです。

構文

class AFX_NOVTABLE CException : public CObject

メンバー

パブリック コンストラクター

名前 説明
CException::CException CException オブジェクトを構築します。

パブリック メソッド

名前 説明
CException::Delete CException オブジェクトを削除します。
CException::ReportError メッセージ ボックス内のエラー メッセージをユーザーに報告します。

解説

CExceptionは抽象基底クラスであるため、CExceptionオブジェクトを直接作成することはできません。派生クラスのオブジェクトを作成する必要があります。 独自の CExceptionスタイルのクラスを作成する必要がある場合は、上記の派生クラスのいずれかをモデルとして使用します。 派生クラスでも IMPLEMENT_DYNAMICが使用されていることを確認します。

派生クラスとその説明を次に示します。

名前 説明
CSimpleException リソース クリティカルな MFC 例外の基本クラス
CInvalidArgException 引数の例外条件が無効です
CMemoryException メモリ不足の例外
CNotSupportedException サポートされていない操作の要求
CArchiveException アーカイブ固有の例外
CFileException ファイル固有の例外
CResourceException Windows リソースが見つからないか、作成できない
COleException OLE 例外
CDBException データベースの例外 (つまり、Open Database Connectivity に基づいて MFC データベース クラスに発生する例外条件)
COleDispatchException OLE ディスパッチ (オートメーション) 例外
CUserException リソースが見つからなかったことを示す例外
CDaoException データ アクセス オブジェクトの例外 (つまり、DAO クラスに対して発生する例外条件)
CInternetException インターネット例外 (つまり、インターネット クラスに対して発生する例外条件)。

これらの例外は、 THROWTHROW_LASTtrycatchand_catch、および end_catch マクロで使用することを目的としています。 例外の詳細については、「 Exception Processing」を参照するか、 Exception Handling (MFC)に関する記事を参照してください。

特定の例外をキャッチするには、適切な派生クラスを使用します。 すべての種類の例外をキャッチするには、 CExceptionを使用し、 CObject::IsKindOf を使用して CException派生クラスを区別します。 CObject::IsKindOfは、動的な型チェックを利用するために、IMPLEMENT_DYNAMIC マクロで宣言されたクラスでのみ機能します。 作成する CException派生クラスも、 IMPLEMENT_DYNAMIC マクロを使用する必要があります。

例外に関する詳細をユーザーに報告するには、 GetErrorMessage または ReportErrorCExceptionのいずれかの派生クラスで動作する 2 つのメンバー関数を呼び出します。

いずれかのマクロによって例外がキャッチされた場合、 CException オブジェクトは自動的に削除されます。自分で削除しないでください。 catch キーワードを使用して例外がキャッチされた場合、例外は自動的に削除されません。 例外オブジェクトを削除するタイミングの詳細については、 Exception Handling (MFC) に関する記事を参照してください。

継承階層

CObject

CException

要件

ヘッダー: afx.h

CException::CException

このメンバー関数は、 CException オブジェクトを構築します。

explicit CException(BOOL bAutoDelete);

パラメーター

b_AutoDelete
CException オブジェクトのメモリがヒープに割り当てられているかどうかをTRUE指定します。 これにより、例外を削除するために Delete メンバー関数が呼び出されたときに、CException オブジェクトが削除されます。 CException オブジェクトがスタック上にある場合、またはグローバル オブジェクトである場合は、FALSEを指定します。 この場合、Delete メンバー関数が呼び出されたときに、CException オブジェクトは削除されません。

解説

通常、このコンストラクターを直接呼び出す必要はありません。 例外をスローする関数は、 CException派生クラスのインスタンスを作成してそのコンストラクターを呼び出すか、MFC スロー関数 ( AfxThrowFileException など) のいずれかを使用して定義済みの型をスローする必要があります。 このドキュメントは、完全を期す目的でのみ提供されています。

CException::Delete

この関数は、 CException オブジェクトがヒープ上に作成されたかどうかを確認し、作成された場合は、そのオブジェクトに対して delete 演算子を呼び出します。

void Delete();

解説

CException オブジェクトを削除するときは、Delete メンバー関数を使用して例外を削除します。 CException オブジェクトはグローバル オブジェクトであるか、スタック上に作成されている可能性があるため、delete演算子を直接使用しないでください。

オブジェクトの作成時にオブジェクトを削除するかどうかを指定できます。 詳細については、CException::CExceptionを参照してください。

C++ try- catch メカニズムを使用している場合にのみ、Deleteを呼び出す必要があります。 MFC マクロ TRYCATCHを使用している場合、これらのマクロは自動的にこの関数を呼び出します。

CFile* pFile = NULL;
// Constructing a CFile object with this override may throw
// a CFile exception, and won't throw any other exceptions.
// Calling CString::Format() may throw a CMemoryException,
// so we have a catch block for such exceptions, too. Any
// other exception types this function throws will be
// routed to the calling function.
// Note that this example performs the same actions as the
// example for CATCH, but uses C++ try/catch syntax instead
// of using the MFC TRY/CATCH macros. This sample must use
// CException::Delete() to delete the exception objects
// before closing the catch block, while the CATCH example
// implicitly performs the deletion via the macros.
try
{
   pFile = new CFile(_T("C:\\WINDOWS\\SYSTEM.INI"),
      CFile::modeRead | CFile::shareDenyNone);
   ULONGLONG ullLength = pFile->GetLength();
   CString str;
   str.Format(_T("Your SYSTEM.INI file is %u bytes long."), ullLength);
   AfxMessageBox(str);
}
catch(CFileException* pEx)
{
   // Simply show an error message to the user.
   pEx->ReportError();
   pEx->Delete();
}
catch(CMemoryException* pEx)
{
   // We can't recover from this memory exception, so we'll
   // just terminate the app without any cleanup. Normally, an
   // an application should do everything it possibly can to
   // clean up properly and _not_ call AfxAbort().
   pEx->Delete();
   AfxAbort();
}
// If an exception occurs in the CFile constructor,
// the language will free the memory allocated by new
// and will not complete the assignment to pFile.
// Thus, our clean-up code needs to test for NULL.
if (pFile != NULL)
{
   pFile->Close();
   delete pFile;
}

CException::ReportError

このメンバー関数を呼び出して、メッセージ ボックス内のエラー テキストをユーザーに報告します。

virtual int ReportError(
    UINT nType = MB_OK,
    UINT nMessageID = 0);

パラメーター

nType
メッセージ ボックスのスタイルを指定します。 メッセージ ボックス スタイルの任意の組み合わせボックスに適用します。 このパラメーターを指定しない場合、既定値は MB_OK です。

nMessageID
例外オブジェクトにエラー メッセージがない場合に表示するメッセージのリソース ID (文字列テーブル エントリ) を指定します。 0 の場合、"エラー メッセージは使用できません" というメッセージが表示されます。

戻り値

AfxMessageBox値。メッセージ ボックスを表示するのに十分なメモリがない場合は 0。 可能な戻り値については、 AfxMessageBox を参照してください。

CException::ReportErrorの使用例を次に示します。 別の例については、 CATCHの例を参照してください。

CFile fileInput;
CFileException ex;

// try to open a file for reading.
// The file will certainly not
// exist because there are too many explicit
// directories in the name.

// if the call to Open() fails, ex will be
// initialized with exception
// information.  the call to ex.ReportError() will
// display an appropriate
// error message to the user, such as
// "\Too\Many\Bad\Dirs.DAT contains an
// invalid path."  The error message text will be
// appropriate for the
// file name and error condition.

if (!fileInput.Open(_T("\\Too\\Many\\Bad\\Dirs.DAT"), CFile::modeRead, &ex))
{
  ex.ReportError();
}
else
{
  // the file was opened, so do whatever work
  // with fileInput we were planning...

  fileInput.Close();
}

関連項目

CObject クラス
階層図
例外処理