예외: 직접 함수에서 예외를 Throw
MFC 예외 처리 패러다임을 사용 하 여 전적으로 MFC 또는 다른 라이브러리 함수에서 throw 된 예외를 catch 하는 것이 가능 합니다.라이브러리 코드에서 throw 되는 예외를 catch 하는 것 외에 예외 조건이 발생할 수 있는 함수를 작성 하는 경우 코드에서 예외 수입니다.
예외가 throw 되 면 현재 함수의 실행 중지 되 고 직접 점프는 catch 프레임 안쪽의 예외 블록입니다.정상적인 종료 경로 함수에서 예외 메커니즘을 무시합니다.따라서 정상 종료 시 삭제 하려는 메모리 블록은 삭제 해야 합니다.
예외를 throw.
같은 MFC 도우미 함수 중 하나를 사용 AfxThrowMemoryException.이러한 함수는 미리 할당 된 예외 개체의 적절 한 형식 throw합니다.
다음 예제에서는 함수는 두 개의 메모리 블록을 할당 하려고 및 실패할 경우 예외를 throw 합니다.
{ char* p1 = (char*)malloc( SIZE_FIRST ); if( p1 == NULL ) AfxThrowMemoryException(); char* p2 = (char*)malloc( SIZE_SECOND ); if( p2 == NULL ) { free( p1 ); AfxThrowMemoryException(); } // ... Do something with allocated blocks ... // In normal exit, both blocks are deleted. free( p1 ); free( p2 ); }
단순히 첫째 할당이 실패 하면 메모리 예외를 throw 할 수 있습니다.첫 번째 할당은 성공 했지만 두 번째 오류가 발생 하면 예외를 throw 하기 전에 첫째 할당 블록을 해제 해야 합니다.두 할당이 실패 하면 정상적으로 진행 하 고 함수를 종료할 때 블록을 약속 수 있습니다.
-또는-
사용자 정의 예외를 사용 하 여 문제 조건을 지정 합니다.모든 형식의 전체 클래스 항목 예외로 throw 할 수 있습니다.
다음 예제는 웨이브 장치를 통해 소리를 재생 하려고 및 오류가 있으면 예외가 throw 됩니다.
#define WAVE_ERROR -5 { // This Win32 API returns 0 if the sound cannot be played. // Throw an integer constant if it fails. if( !PlaySound(_T("SIREN.WAV"), NULL, SND_ASYNC) ) throw WAVE_ERROR; }
[!참고]
MFC의 기본 처리 예외 적용에 대 한 포인터에만 CException 개체 (개체의 CException-클래스를 파생).위의 예제에서는 MFC의 예외 메커니즘이 무시 됩니다.