다음을 통해 공유


예외: 자체 함수에서 예외 Throw

MFC 예외 처리 패러다임을 사용하여 MFC 또는 다른 라이브러리의 함수에서 throw된 예외를 catch할 수 있습니다. 라이브러리 코드에서 throw된 예외를 catch하는 것 외에도 예외 조건이 발생할 수 있는 함수를 작성하는 경우 사용자 고유의 코드에서 예외를 throw할 수 있습니다.

예외가 throw되면 현재 함수의 실행이 중지되고 가장 안쪽 예외 프레임의 블록으로 catch 직접 이동합니다. 예외 메커니즘은 함수에서 일반 종료 경로를 무시합니다. 따라서 일반 종료에서 삭제될 메모리 블록을 삭제해야 합니다.

예외를 throw하려면

  1. 와 같은 AfxThrowMemoryExceptionMFC 도우미 함수 중 하나를 사용합니다. 이러한 함수는 적절한 형식의 미리 할당된 예외 개체를 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하기 전에 첫 번째 할당 블록을 해제해야 합니다. 두 할당이 모두 성공하면 정상적으로 진행하고 함수를 종료할 때 블록을 해제할 수 있습니다.

    • 또는
  2. 사용자 정의 예외를 사용하여 문제 조건을 나타냅니다. 예외로 모든 형식, 심지어 전체 클래스의 항목을 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의 예외 메커니즘을 무시합니다.

참고 항목

예외 처리