CATCH
更新 : 2007 年 11 月
直前の TRY ブロックの中で最初にスローされた例外タイプを受け取ったコードのブロックを定義します。
CATCH(exception_class, exception_object_pointer_name )
パラメータ
exception_class
調べようとする例外タイプを指定します。標準の例外クラスの一覧については、「CException」を参照してください。exception_object_pointer_name
マクロによって作られる例外オブジェクトのポインタ名。このポインタ名を使って CATCH ブロック内の例外オブジェクトにアクセスできます。この変数はユーザーのために宣言されています。
解説
例外処理プログラムでは、適切である場合、例外オブジェクトに対し例外の特定の原因についてさらに詳しい情報を求めることができます。THROW_LAST マクロを起動することにより 1 つ外側の例外処理フレームに処理を移すことができます。TRY ブロックは、END_CATCH マクロを使って終了します。
exception_class が CException であるときは、すべての例外がキャッチできます。どの例外がスローされたかを調べるには、CObject::IsKindOf を使います。異なる例外タイプをキャッチするには AND_CATCH を順次使うと、より効果的なこともあります。
例外オブジェクト ポインタがマクロによって作られます。ユーザーが宣言する必要はありません。
メモ : |
---|
CATCH ブロックは C++ のスコープとして定義します ({} で囲みます)。このスコープ内で変数を宣言すると、このスコープ内でしかその変数にアクセスできません。このことは、exception_object_pointer_name 変数にも適用されます。 |
例外と CATCH マクロの詳細については、「例外処理 (MFC)」を参照してください。
使用例
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.
TRY
{
pFile = new CFile(_T( "C:\\WINDOWS\\SYSTEM.INI"),
CFile::modeRead | CFile::shareDenyNone);
ULONGLONG dwLength = pFile->GetLength();
CString str;
str.Format(_T("Your SYSTEM.INI file is %I64u bytes long.") , dwLength);
AfxMessageBox(str);
}
CATCH(CFileException, pEx)
{
// Simply show an error message to the user.
pEx->ReportError();
}
AND_CATCH(CMemoryException, pEx)
{
// We can't recover from this memory exception, so we'll
// just terminate the app without any cleanup. Normally,
// an application should do everything it possibly can to
// clean up properly and not call AfxAbort().
AfxAbort();
}
END_CATCH
// 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 cleanup code needs to test for NULL.
if (pFile != NULL)
{
pFile->Close();
delete pFile;
}
必要条件
ヘッダー : afx.h