다음을 통해 공유


예외: MFC 매크로 및 C++ 예외를 사용합니다.

이 문서에서는 MFC 예외 처리 매크로 C++ 예외 처리 키워드를 사용 하는 코드를 작성 하기 위한 고려 사항에 설명 합니다.

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

  • 예외 키워드 및 매크로 혼합

  • Try 블록 내에 catch 블록

예외 키워드 및 매크로 혼합

MFC 예외 매크로 같은 프로그램에서 C++ 예외 키워드를 함께 사용할 수 있습니다.하지만 범위를 벗어난 이동 하는 경우 코드는 예외 처리 키워드를 사용 하지 않는 반면 매크로 예외 개체를 자동으로 삭제 하기 때문에 MFC 매크로와 C++ 예외 키워드 같은 블록에서 함께 합니다.자세한 내용은 문서를 참조 하십시오. 예외: 예외를 삭제 하 고 Catching.

주요 차이점은 매크로 키워드는 예외가 범위를 벗어날 때 매크로 "자동 으로" catch 된 예외 삭제입니다.키워드를 사용 하 여 코드에는 포함 되지 않습니다. 예외는 catch 블록에서 발견 되었습니다 명시적으로 삭제 해야 합니다.매크로 C++ 예외 키워드를 혼합 예외 개체를 삭제 하면 메모리 누수가 발생 하거나 예외 두 번 삭제 될 때 손상 힙 있습니다.

예를 들어, 다음 코드는 예외 포인터를 무효로 만듭니다.

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_LAST 대신 매크로 THROW 문의 하면는 "외부" 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 블록을 시도 하십시오.

내에서 현재 예외를 다시 throw 없습니다는 시도 블록 안에 있는 CATCH 블록.다음 예제는 유효 하지 않습니다.

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

자세한 내용은 예외: 예외 내용 검사.

참고 항목

개념

MFC에서 처리 하는 예외