예외: MFC 매크로 및 C++ 예외 사용

이 문서에서는 MFC 예외 처리 매크로와 C++ 예외 처리 키워드(keyword) 모두 사용하는 코드 작성에 대한 고려 사항을 설명합니다.

이 문서에서는 다음 항목을 다룹니다.

예외 키워드 및 매크로 혼합

동일한 프로그램에서 MFC 예외 매크로와 C++ 예외 키워드(keyword) 혼합할 수 있습니다. 그러나 MFC 매크로를 동일한 블록의 C++ 예외 키워드(keyword) 혼합할 수는 없습니다. 예외 처리 키워드(keyword) 사용하는 코드는 예외 개체가 범위를 벗어날 때 예외 개체가 자동으로 삭제되기 때문입니다. 자세한 내용은 예외: 예외 Catch 및 삭제 문서를 참조하세요.

매크로와 키워드(keyword) 간의 기본 차이점은 예외가 범위를 벗어날 때 매크로가 catch된 예외를 "자동으로" 삭제한다는 것입니다. 키워드(keyword) 사용하는 코드는 그렇지 않습니다. catch 블록에서 catch된 예외는 명시적으로 삭제해야 합니다. 매크로와 C++ 예외 키워드(keyword) 혼합하면 예외 개체가 삭제되지 않을 때 메모리 누수 또는 예외가 두 번 삭제될 때 힙 손상이 발생할 수 있습니다.

예를 들어 다음 코드는 예외 포인터를 무효화합니다.

TRY
{
   TRY
   {
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)  // The "inner" catch block
{
   throw;  // Invalid attempt to throw exception
         // to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
   // Pointer e is invalid because
   // it was deleted in the inner catch block.
}
END_CATCH

실행이 e "내부" CATCH 블록에서 전달될 때 삭제되므로 문제가 발생합니다. THROW 문 대신 THROW_LAST 매크로를 사용하면 "외부" CATCH 블록이 유효한 포인터를 받게 됩니다.

TRY
{
   TRY
   {
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)  // The "inner" catch block
{
   THROW_LAST(); // Throw exception to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
   // Pointer e is valid because
   // THROW_LAST() was used.
}
END_CATCH

Catch 블록 내부 블록 사용해 보기

CATCH 블록 내에 있는 블록 내에서 현재 예외를 try 다시 throw할 수 없습니다. 다음 예제가 잘못되었습니다.

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   try
   {
      throw;  // Wrong.  Causes e (the exception 
            // being thrown) to be deleted.
   }
   catch (CException* exception)
   {
      exception->ReportError();
   }
}
END_CATCH

자세한 내용은 예외: 예외 내용 검사를 참조 하세요.

참고 항목

예외 처리