CATCH
Try の前にあるブロックでスローされた最初の例外の種類をキャッチするコード ブロックを定義します。
CATCH(exception_class, exception_object_pointer_name )
パラメーター
exception_class
例外の種類をテストするように指定します。標準の例外クラスの一覧については、クラス CExceptionを参照してください。exception_object_pointer_name
マクロによって作成された例外オブジェクトのポインターの名前を指定します。Catch ブロック内の例外オブジェクトにアクセスするには、ポインターの名前を使用できます。この変数は、宣言されます。
解説
例外処理コードは適切な質問、例外の原因に関する詳細情報を取得するために例外オブジェクトにできます。次の外部の例外の帯に処理をシフトするに THROW_LAST のマクロを呼び出します。END_CATCH のマクロの Try ブロックを終了します。
exception_class が クラス CException場合、すべての例外の種類がキャッチされます。どの特定の例外がスローされたかを判断するために CObject::IsKindOf のメンバー関数を使用できます。複数の種類の例外をキャッチする適切な方法は AND_CATCH 順次ステートメントを、別の例外の種類を除き、それぞれ使用することです。
例外オブジェクトのポインターは、マクロによって作成されます。自分で宣言する必要はありません。
[!メモ]
Catch ブロックは中かっこでアウトラインは C.C++ のスコープで定義されます。このスコープの変数を宣言した場合、そのスコープ内でのみアクセスできます。これは、 exception_object_pointer_nameに適用されます。
例外と Catch マクロの詳細については、技術情報 例外を参照してください。
使用例
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