예외 처리

프로그램이 실행되면 "예외"라는 여러 가지 비정상적인 조건과 오류가 발생할 수 있습니다. 여기에는 메모리 부족, 리소스 할당 오류 및 파일 찾기 실패가 포함될 수 있습니다.

Microsoft Foundation 클래스 라이브러리는 C++에 대한 ANSI 표준 위원회에서 제안한 체계를 기준으로 자세히 모델링되는 예외 처리 체계를 사용합니다. 비정상적인 상황이 발생할 수 있는 함수를 호출하기 전에 예외 처리기를 설정해야 합니다. 함수가 비정상적인 조건을 발견하면 예외가 throw되고 컨트롤이 예외 처리기에 전달됩니다.

Microsoft Foundation 클래스 라이브러리에 포함된 여러 매크로는 예외 처리기를 설정합니다. 다른 여러 전역 함수는 필요한 경우 특수한 예외를 throw하고 프로그램을 종료하는 데 도움이 됩니다. 이러한 매크로 및 전역 함수는 다음 범주로 분류됩니다.

  • 예외 처리기를 구성하는 예외 매크로입니다.

  • 예외 throw 함수) - 특정 형식의 예외를 생성합니다.

  • 종료 함수로 인해 프로그램 종료가 발생합니다.

예제 및 자세한 내용은 예외 문서를 참조하세요.

예외 매크로

이름 설명
시도 예외 처리를 위한 코드 블록을 지정합니다.
잡을 이전 TRY 블록에서 예외를 catch하기 위한 코드 블록을 지정합니다.
CATCH_ALL 이전 TRY 블록에서 모든 예외를 catch하기 위한 코드 블록을 지정합니다.
AND_CATCH 이전 TRY 블록에서 추가 예외 형식을 catch하기 위한 코드 블록을 지정합니다.
AND_CATCH_ALL 이전 TRY 블록에서 throw된 다른 모든 추가 예외 형식을 catch하기 위한 코드 블록을 지정합니다.
END_CATCH 마지막 CATCH 또는 AND_CATCH 코드 블록을 종료합니다.
END_CATCH_ALL 마지막 CATCH_ALL 코드 블록을 종료합니다.
던져 지정된 예외를 throw합니다.
THROW_LAST 현재 처리된 예외를 다음 외부 처리기에 throw합니다.

예외 throw 함수

이름 설명
AfxThrowArchiveException 보관 예외를 throw합니다.
AfxThrowFileException 파일 예외를 throw합니다.
AfxThrowInvalidArgException 잘못된 인수 예외를 throw합니다.
AfxThrowMemoryException 메모리 예외를 throw합니다.
AfxThrowNotSupportedException 지원되지 않는 예외를 throw합니다.
AfxThrowResourceException Windows 리소스를 찾을 수 없는 예외를 throw합니다.
AfxThrowUserException 사용자가 시작한 프로그램 작업에서 예외를 throw합니다.

MFC는 OLE 예외를 위한 두 가지 예외 throw 함수를 제공합니다.

OLE 예외 함수

이름 설명
AfxThrowOleDispatchException OLE 자동화 함수 내에서 예외를 throw합니다.
AfxThrowOleException OLE 예외를 throw합니다.

데이터베이스 예외를 지원하기 위해 데이터베이스 클래스는 두 개의 예외 클래스 CDBExceptionCDaoException예외 형식을 지원하는 전역 함수를 제공합니다.

DAO 예외 함수

이름 설명
AfxThrowDAOException 사용자 고유의 코드에서 CDaoException 을 throw합니다.
AfxThrowDBException 사용자 고유의 코드에서 CDBException 을 throw합니다.

MFC는 다음 종료 함수를 제공합니다.

종료 함수

이름 설명
AfxAbort 치명적인 오류가 발생할 때 애플리케이션을 종료하기 위해 호출됩니다.

TRY

TRY 블록을 설정합니다.

TRY

설명

TRY 블록은 예외를 throw할 수 있는 코드 블록을 식별합니다. 이러한 예외는 다음 CATCHAND_CATCH 블록에서 처리됩니다. 재귀가 허용됩니다. 예외는 무시하거나 THROW_LAST 매크로를 사용하여 외부 TRY 블록으로 전달될 수 있습니다. TRY 블록을 END_CATCH 또는 END_CATCH_ALL 매크로로 종료합니다.

자세한 내용은 예외 문서를 참조하세요.

예시

CATCH에 대한 예제를 참조하세요.

요구 사항

헤더: afx.h

잡을

이전 TRY 블록에서 throw된 첫 번째 예외 형식을 catch하는 코드 블록을 정의합니다.

CATCH(exception_class, exception_object_pointer_name)

매개 변수

exception_class
테스트할 예외 유형을 지정합니다. 표준 예외 클래스 목록은 CException 클래스를 참조하세요.

exception_object_pointer_name
매크로에 의해 생성되는 예외-개체 포인터에 대한 이름을 지정합니다. 포인터 이름을 사용하여 CATCH 블록 내의 예외 개체에 액세스할 수 있습니다. 이 변수는 자동으로 선언됩니다.

설명

예외 처리 코드는 필요한 경우 예외 개체를 확인하여 예외의 특정 원인에 대한 추가 정보를 가져올 수 있습니다. THROW_LAST 매크로를 호출하여 처리를 다음 외부 예외 프레임으로 이동합니다. TRY 블록을 END_CATCH 매크로로 종료합니다.

exception_class 클래스CException인 경우 모든 예외 형식이 catch됩니다. CObject::IsKindOf 멤버 함수를 사용하여 throw된 특정 예외를 확인할 수 있습니다. 여러 종류의 예외를 catch하는 더 좋은 방법은 각각 다른 예외 형식의 순차 적 AND_CATCH 문을 사용하는 것입니다.

예외 개체 포인터는 매크로에 의해 만들어집니다. 직접 선언할 필요가 없습니다.

참고 항목

CATCH 블록은 중괄호로 구분된 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;
}

CATCH_ALL

이전 TRY 블록에서 throw된 모든 예외 형식을 catch하는 코드 블록을 정의합니다.

CATCH_ALL(exception_object_pointer_name)

매개 변수

exception_object_pointer_name
매크로에 의해 생성되는 예외-개체 포인터에 대한 이름을 지정합니다. 포인터 이름을 사용해서 CATCH_ALL 블록 내에서 예외 개체에 액세스할 수 있습니다. 이 변수는 자동으로 선언됩니다.

설명

예외 처리 코드는 필요한 경우 예외 개체를 확인하여 예외의 특정 원인에 대한 추가 정보를 가져올 수 있습니다. THROW_LAST 매크로를 호출하여 다음 외부 예외 프레임으로 처리를 이동합니다. CATCH_ALL 사용하는 경우 try 블록을 END_CATCH_ALL 매크로로 종료합니다.

참고 항목

CATCH_ALL 블록은 중괄호로 구분된 C++ 범위로 정의됩니다. 이 범위에서 변수를 선언하면 해당 범위 내에서만 액세스할 수 있습니다.

예외에 대한 자세한 내용은 예외 문서를 참조하세요.

예시

CFile::Abort에 대한 예제를 참조하세요.

요구 사항

헤더 afx.h

AND_CATCH

이전 TRY 블록에서 throw된 추가 예외 형식을 catch하기 위한 코드 블록을 정의합니다.

AND_CATCH(exception_class, exception_object_pointer_name)

매개 변수

exception_class
테스트할 예외 유형을 지정합니다. 표준 예외 클래스 목록은 CException 클래스를 참조하세요.

exception_object_pointer_name
매크로에서 만들 예외 개체 포인터의 이름입니다. 포인터 이름을 사용하여 AND_CATCH 블록 내의 예외 개체에 액세스할 수 있습니다. 이 변수는 자동으로 선언됩니다.

설명

CATCH 매크로를 사용하여 하나의 예외 형식을 catch한 다음, AND_CATCH 매크로를 사용하여 각 후속 형식을 catch합니다. TRY 블록을 END_CATCH 매크로로 종료합니다.

예외 처리 코드는 필요한 경우 예외 개체를 확인하여 예외의 특정 원인에 대한 추가 정보를 가져올 수 있습니다. AND_CATCH 블록 내에서 THROW_LAST 매크로를 호출하여 처리를 다음 외부 예외 프레임으로 이동합니다. AND_CATCH 이전 CATCH 또는 AND_CATCH 블록의 끝을 표시합니다.

참고 항목

AND_CATCH 블록은 C++ 범위(중괄호로 표시됨)로 정의됩니다. 이 범위에서 변수를 선언하는 경우 해당 범위 내에서만 액세스할 수 있습니다. 이는 exception_object_pointer_name 변수에도 적용됩니다.

예시

CATCH에 대한 예제를 참조하세요.

요구 사항

헤더 afx.h

AND_CATCH_ALL

이전 TRY 블록에서 throw된 추가 예외 형식을 catch하기 위한 코드 블록을 정의합니다.

AND_CATCH_ALL(exception_object_pointer_name)

매개 변수

exception_object_pointer_name
매크로에서 만들 예외 개체 포인터의 이름입니다. 포인터 이름을 사용하여 AND_CATCH_ALL 블록 내의 예외 개체에 액세스할 수 있습니다. 이 변수는 자동으로 선언됩니다.

설명

CATCH 매크로를 사용하여 하나의 예외 형식을 catch한 다음, AND_CATCH_ALL 매크로를 사용하여 다른 모든 후속 형식을 catch합니다. AND_CATCH_ALL 사용하는 경우 try 블록을 END_CATCH_ALL 매크로로 종료합니다.

예외 처리 코드는 필요한 경우 예외 개체를 확인하여 예외의 특정 원인에 대한 추가 정보를 가져올 수 있습니다. AND_CATCH_ALL 블록 내의 THROW_LAST 매크로를 호출하여 처리를 다음 외부 예외 프레임으로 이동합니다. AND_CATCH_ALL 이전 CATCH 또는 AND_CATCH_ALL 블록의 끝을 표시합니다.

참고 항목

AND_CATCH_ALL 블록은 C++ 범위(중괄호로 구분됨)로 정의됩니다. 이 범위에서 변수를 선언하는 경우 해당 범위 내에서만 액세스할 수 있습니다.

요구 사항

헤더 afx.h

END_CATCH

마지막 CATCH 또는 AND_CATCH 블록의 끝을 표시합니다.

END_CATCH

설명

END_CATCH 매크로에 대한 자세한 내용은 예외 문서를 참조하세요.

요구 사항

헤더 afx.h

END_CATCH_ALL

마지막 CATCH_ALL88 또는 AND_CATCH_ALL 블록의 끝을 표시합니다.

END_CATCH_ALL

요구 사항

헤더 afx.h

THROW(MFC)

지정된 예외를 throw합니다.

THROW(exception_object_pointer)

매개 변수

exception_object_pointer
에서 파생된 예외 개체를 가리킵니다 CException.

설명

THROW 는 프로그램 실행을 중단하여 프로그램에서 연결된 CATCH 블록에 제어를 전달합니다. CATCH 블록을 제공하지 않은 경우 컨트롤이 오류 메시지를 출력하고 종료하는 Microsoft Foundation 클래스 라이브러리 모듈에 전달됩니다.

자세한 내용은 예외 문서를 참조하세요.

요구 사항

헤더 afx.h

THROW_LAST

예외를 다음 외부 CATCH 블록으로 다시 throw합니다.

THROW_LAST()

설명

이 매크로를 사용하면 로컬로 만든 예외를 throw할 수 있습니다. 방금 catch한 예외를 throw하려고 하면 일반적으로 범위를 벗어나 삭제됩니다. THROW_LAST 예외는 다음 CATCH 처리기에 올바르게 전달됩니다.

자세한 내용은 예외 문서를 참조하세요.

예시

CFile::Abort에 대한 예제를 참조하세요.

요구 사항

헤더 afx.h

AfxThrowArchiveException

보관 예외를 throw합니다.

void  AfxThrowArchiveException(int cause, LPCTSTR lpszArchiveName);

매개 변수

원인
예외의 이유를 나타내는 정수를 지정합니다. 가능한 값 목록은 CArchiveException::m_cause 참조하세요.

lpszArchiveName
예외를 발생시킨 개체의 CArchive 이름을 포함하는 문자열을 가리킵니다(사용 가능한 경우).

요구 사항

헤더 afx.h

AfxThrowFileException

파일 예외를 throw합니다.

void AfxThrowFileException(
    int cause,
    LONG lOsError = -1,
    LPCTSTR lpszFileName = NULL);

매개 변수

원인
예외의 이유를 나타내는 정수를 지정합니다. 가능한 값 목록은 CFileException::m_cause 참조하세요.

lOsError
예외의 이유를 나타내는 운영 체제 오류 번호(사용 가능한 경우)를 포함합니다. 오류 코드 목록은 운영 체제 설명서를 참조하세요.

lpszFileName
예외를 발생시킨 파일의 이름을 포함하는 문자열을 가리킵니다(사용 가능한 경우).

설명

운영 체제 오류 코드를 기반으로 원인을 확인할 책임이 있습니다.

요구 사항

헤더 afx.h

AfxThrowInvalidArgException

잘못된 인수 예외를 throw합니다.

구문

void AfxThrowInvalidArgException( );

설명

이 함수는 잘못된 인수를 사용할 때 호출됩니다.

요구 사항

헤더: afx.h

AfxThrowMemoryException

메모리 예외를 throw합니다.

void AfxThrowMemoryException();

설명

기본 시스템 메모리 할당자(예: malloc 및 GlobalAlloc Windows 함수)에 대한 호출이 실패하는 경우 이 함수를 호출합니다. 메모리 할당이 실패할 경우 메모리 예외가 자동으로 throw되므로 호출 newnew 할 필요가 없습니다.

요구 사항

헤더 afx.h

AfxThrowNotSupportedException

지원되지 않는 기능에 대한 요청의 결과인 예외를 throw합니다.

void AfxThrowNotSupportedException();

요구 사항

헤더 afx.h

AfxThrowResourceException

리소스 예외를 throw합니다.

void  AfxThrowResourceException();

설명

이 함수는 일반적으로 Windows 리소스를 로드할 수 없는 경우 호출됩니다.

요구 사항

헤더 afx.h

AfxThrowUserException

예외를 throw하여 최종 사용자 작업을 중지합니다.

void AfxThrowUserException();

설명

이 함수는 일반적으로 사용자에게 오류를 보고한 직후 AfxMessageBox 에 호출됩니다.

요구 사항

헤더 afx.h

AfxThrowOleDispatchException

이 함수를 사용하여 OLE 자동화 함수 내에서 예외를 throw합니다.

void AFXAPI AfxThrowOleDispatchException(
    WORD wCode ,
    LPCSTR lpszDescription,
    UINT nHelpID = 0);

void AFXAPI AfxThrowOleDispatchException(
    WORD wCode,
    UINT nDescriptionID,
    UINT nHelpID = -1);

매개 변수

wCode
애플리케이션과 관련된 오류 코드입니다.

lpszDescription
오류에 대한 구두 설명입니다.

nDescriptionID
구두 오류 설명의 리소스 ID입니다.

nHelpID
애플리케이션의 도움말에 대한 도움말 컨텍스트(. HLP) 파일.

설명

이 함수에 제공된 정보는 구동 애플리케이션(Microsoft Visual Basic 또는 다른 OLE 자동화 클라이언트 애플리케이션)에서 표시할 수 있습니다.

예시

// Sort is method of automation class CStrArrayDoc
long CStrArrayDoc::Sort(VARIANT* vArray)
{
   USES_CONVERSION;

   // Type check VARIANT parameter. It should contain a BSTR array
   // passed by reference. The array must be passed by reference; it is
   // an in-out-parameter.

   // throwing COleDispatchException allows the EXCEPINFO structure of 
   // IDispatch::Invoke() to set
   if (V_VT(vArray) != (VT_ARRAY | VT_BSTR))
      AfxThrowOleDispatchException(1001,
         _T("Type Mismatch in Parameter. Pass a string array by reference"));

   // ...
   // ...

   return 0;
}

요구 사항

헤더 afx.h

AfxThrowOleException

형식 COleException 의 개체를 만들고 예외를 throw합니다.

void AFXAPI AfxThrowOleException(SCODE sc);
void AFXAPI AfxThrowOleException(HRESULT hr);

매개 변수

sc
예외의 이유를 나타내는 OLE 상태 코드입니다.

Hr
예외의 이유를 나타내는 결과 코드에 대한 핸들입니다.

설명

HRESULT를 인수로 사용하는 버전은 해당 결과 코드를 해당 SCODE로 변환합니다. HRESULT 및 SCODE에 대한 자세한 내용은 Windows SDK의 COM 오류 코드 구조를 참조하세요.

요구 사항

헤더 afxdao.h

AfxThrowDaoException

이 함수를 호출하여 사용자 고유의 코드에서 CDaoException 형식의 예외를 throw합니다.

void AFXAPI AfxThrowDaoException(
    int nAfxDaoError = NO_AFX_DAO_ERROR,
    SCODE scode = S_OK);

매개 변수

nAfxDaoError
CDaoException::m_nAfxDaoError 아래에 나열된 값 중 하나일 수 있는 DAO 확장 오류 코드를 나타내는 정수 값입니다.

scode
SCODE 형식의 DAO의 OLE 오류 코드입니다. 자세한 내용은 CDaoException::m_scode 참조하세요.

설명

프레임워크는 .를 호출 AfxThrowDaoException합니다. 호출에서 매개 변수 중 하나 또는 둘 다를 전달할 수 있습니다. 예를 들어 CDaoException::nAfxDaoError에 정의된 오류 중 하나를 발생시키지만 코드 매개 변수에 대해 신경 쓰지 않는 경우 nAfxDaoError 매개 변수에 유효한 코드를 전달하고 코드의 기본값을 적용합니다.

MFC DAO 클래스와 관련된 예외에 대한 자세한 내용은 이 책의 클래스 CDaoException 와 예외: 데이터베이스 예외 문서를 참조하세요.

요구 사항

헤더 afxdb.h

AfxThrowDBException

이 함수를 호출하여 사용자 고유의 코드에서 형식 CDBException 의 예외를 throw합니다.

void AfxThrowDBException(
    RETCODE nRetCode,
    CDatabase* pdb,
    HSTMT hstmt);

매개 변수

nRetCode
예외가 throw된 오류 형식을 정의하는 RETCODE 형식의 값입니다.

Pdb
예외가 CDatabase 연결된 데이터 원본 연결을 나타내는 개체에 대한 포인터입니다.

Hstmt
예외가 연결된 문 핸들을 지정하는 ODBC HSTMT 핸들입니다.

설명

프레임워크는 ODBC API 함수 호출에서 ODBC RETCODE를 수신할 때 호출 AfxThrowDBException 하고 RETCODE를 예상 가능한 오류가 아닌 예외적인 조건으로 해석합니다. 예를 들어 디스크 읽기 오류로 인해 데이터 액세스 작업이 실패할 수 있습니다.

ODBC에서 정의한 RETCODE 값에 대한 자세한 내용은 Windows SDK의 8장 "상태 및 오류 정보 검색"을 참조하세요. 이러한 코드에 대한 MFC 확장에 대한 자세한 내용은 CDBException 클래스를 참조하세요.

요구 사항

헤더 afx.h

AfxAbort

MFC에서 제공하는 기본 종료 함수입니다.

void  AfxAbort();

설명

AfxAbort 는 처리할 수 없는 catch되지 않은 예외와 같은 심각한 오류가 있을 때 MFC 멤버 함수에 의해 내부적으로 호출됩니다. 복구할 수 없는 치명적인 오류가 발생하는 경우 드문 경우를 호출 AfxAbort 할 수 있습니다.

예시

CATCH에 대한 예제를 참조하세요.

요구 사항

헤더 afx.h

참고 항목

매크로 및 전역
CException 클래스
CInvalidArgException 클래스