CException
수업
MFC 라이브러리의 모든 예외에 대한 기본 클래스입니다.
구문
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 |
인터넷 예외(즉, 인터넷 클래스에 대해 발생하는 예외 조건). |
이러한 예외는 , THROW_LAST
, try
, catch
and_catch
및 매크로와 end_catch
함께 THROW
사용됩니다. 예외에 대한 자세한 내용은 예외 처리를 참조하거나 MFC(예외 처리) 문서를 참조하세요.
특정 예외를 catch하려면 적절한 파생 클래스를 사용합니다. 모든 유형의 예외를 catch하려면 다음을 사용하여 CException
CObject::IsKindOf
파생 클래스를 CException
구분합니다. CObject::IsKindOf
동적 형식 검사를 활용하기 위해 매크로로 IMPLEMENT_DYNAMIC
선언된 클래스에 대해서만 작동합니다. 만든 파생 CException
클래스도 매크로를 IMPLEMENT_DYNAMIC
사용해야 합니다.
호출하여 사용자에게 GetErrorMessage
예외에 대한 세부 정보를 보고하거나 ReportError
파생 클래스 중 CException
에서 작동하는 두 멤버 함수를 보고할 수 있습니다.
매크로 중 하나에서 예외가 catch되면 개체가 CException
자동으로 삭제됩니다. 직접 삭제하지 마세요. 키워드를 사용하여 예외가 catch
catch되면 자동으로 삭제되지 않습니다. 예외 개체를 삭제하는 시기에 대한 자세한 내용은 MFC(예외 처리) 문서를 참조하세요.
상속 계층 구조
CException
요구 사항
머리글: afx.h
CException::CException
이 멤버 함수는 개체를 CException
생성합니다.
explicit CException(BOOL bAutoDelete);
매개 변수
b_AutoDelete
TRUE
개체의 메모리가 CException
힙에 할당되었는지 지정합니다. 이로 인해 멤버 함수가 CException
호출되어 예외를 Delete
삭제할 때 개체가 삭제됩니다. 개체가 CException
스택에 있는지 아니면 전역 개체인지 지정 FALSE
합니다. 이 경우 멤버 함수가 CException
호출될 때 개체가 Delete
삭제되지 않습니다.
설명
일반적으로 이 생성자를 직접 호출할 필요가 없습니다. 예외를 throw하는 함수는 파생 클래스의 인스턴스를 CException
만들고 해당 생성자를 호출하거나 미리 정의된 형식을 throw하기 위해 MFC throw 함수 AfxThrowFileException
중 하나를 사용해야 합니다. 이 설명서는 완전성을 위해서만 제공됩니다.
CException::Delete
이 함수는 개체가 CException
힙에 만들어졌는지 확인하고, 이 경우 개체의 연산자를 delete
호출합니다.
void Delete();
설명
개체를 삭제할 CException
때 멤버 함수를 Delete
사용하여 예외를 삭제합니다. 개체가 delete
전역 개체이거나 스택에 만들어졌기 때문에 CException
연산자를 직접 사용하지 마세요.
개체를 생성할 때 개체를 삭제할지 여부를 지정할 수 있습니다. 자세한 내용은 CException::CException
를 참조하세요.
C++ try
- catch
메커니즘을 사용하는 경우에만 호출 Delete
하면 됩니다. MFC 매크로 TRY
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.
// 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이면 "오류 메시지를 사용할 수 없습니다."라는 메시지가 표시됩니다.
Return Value
값입니다 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();
}