다음을 통해 공유


예외: 예외 매크로 버전 3.0의 변경

이것은 고급 항목입니다.

MFC 버전 3.0 이상에서 예외 처리 매크로 C++ 예외를 사용 하도록 변경 되었습니다.이 문서에서는 이러한 변경 내용이 매크로 사용 하는 기존 코드의 동작에 미치는 영향을 알 수 있습니다.

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

  • 예외 형식 및 CATCH 매크로

  • 예외를 throw 할 때

예외 형식 및 CATCH 매크로

이전 버전의 MFC CATCH 매크로 예외 형식입니다; 확인 합니다 MFC 런타임 형식 정보 사용 즉, 예외 형식은 catch 쪽에서 결정 됩니다.그러나 C++ 예외, 예외 형식은 항상 throw 사이트에서 throw 되는 예외 개체의 형식에 의해 결정 됩니다.드물긴 하지만 포인터를 throw 된 개체의 형식을 throw 된 개체의 형식에서를 다른 위치에이 비 호환성 문제가 발생 합니다.

다음 예제에서는 결과를이 MFC 버전 3.0 및 이전 버전 간의이 차이점을 보여 줍니다.

TRY
{
   THROW( (CException*) new CCustomException() );
}
CATCH( CCustomException, e )
{
   TRACE( "MFC 2.x will land here\n" );
}
AND_CATCH( CException, e )
{
   TRACE( "MFC 3.0 will land here\n" );
}
END_CATCH

처음에 항상 제어를 전달 하기 때문에이 코드 3.0 버전에서 다르게 동작 catch 와 일치 하는 예외 선언 블록입니다.Throw 식의 결과

THROW( (CException*) new CCustomException() );

으로 throw 되는 **CException ***로 구성 된 경우에에 CCustomException.CATCH MFC 버전 2.5 및 이전 사용 매크로 CObject::IsKindOf 런타임에 형식을 테스트 합니다.때문에 식

e->IsKindOf(RUNTIME_CLASS(CException));

첫 번째 catch 블록은 예외를 catch 하는 true입니다.C + + 예외를 사용 하 여 여러 가지 예외 처리 매크로 구현는 버전 3.0에 두 번째 catch 블록에서 발생 일치 CException.

다음과 같은 코드는 흔하지 않습니다.예외 개체가 제네릭 허용 하는 다른 함수에 전달 될 때 일반적으로 나타나는 CException *, "이러한" 프로세싱을 수행 하 고 마지막으로 예외를 throw 합니다.

이 문제를 해결 하려면 함수에서 호출 코드로 throw 식을 이동 하 고 예외가 생성 될 때 컴파일러에 알려진 실제 형식의 예외를 throw 합니다.

예외를 throw 할 때

Catch 블록이 해당 catch 같은 예외 포인터 throw 할 수 없습니다.

예를 들어,이 코드 이전 버전에서는 유효 했지만 됩니다 버전 3.0와 예기치 않은 결과:

   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH( CException, e )
   {
      THROW( e );    // Wrong. Use THROW_LAST() instead
   }
   END_CATCH
}

사용 하 여 THROW catch에서 블록 포인터를 하면 됩니다. e 외부 catch 사이트 잘못 된 포인터를 받을 수 있도록 삭제 될 수 있습니다.Use THROW_LAST to re-throw e.

자세한 내용은 예외: 예외를 삭제 하 고 Catching.

참고 항목

개념

MFC에서 처리 하는 예외