예외: MFC 예외 매크로를 변환

이것은 고급 항목입니다.

이 문서에서는 Mfc 매크로로 작성 된 기존 코드를 변환 하는 방법에 설명- 시도, CATCH, THROW등-C++ 예외 처리 키워드를 사용 하 시도, catch, 및 throw.다음 내용을 다룹니다.

  • 변환의 장점

  • C + + 예외를 사용 하려면 예외 매크로 코드로 변환 합니다.

변환의 이점

매크로 구현에서는 MFC 버전 3.0 및 이전 버전에서 구현 간의 차이점에 주의 해야 하지만 아마도 기존 코드를 변환할 필요는 없습니다.이러한 차이점과 바꾼 코드 동작 설명 예외: 예외 매크로 버전 3.0의 변경.

변환의 장점은 다음과 같습니다.

  • C + + 예외 처리 키워드를 사용 하는 코드에는 약간 더 작은 컴파일합니다.EXE 또는.DLL입니다.

  • C + + 예외 처리 키워드를 보다 융통성이 있습니다: 복사할 수 있는 데이터 형식의 예외를 처리할 수 있습니다 (int, float, char등) 예외 클래스에만 매크로가 처리 되는 반면, CException 및 파생 된 클래스에서.

주요 차이점은 매크로 키워드는 예외가 범위를 벗어날 때 catch 된 예외를 "자동" 매크로 사용 하 여 코드 삭제입니다.Catch 된 예외를 명시적으로 삭제 해야 하므로 코드의 키워드를 사용 하지 않습니다.자세한 내용은 문서를 참조 하십시오. 예외: 예외를 삭제 하 고 Catching.

또 다른 차이점은 구문입니다.매크로 키워드의 구문은 세 가지 면에서 다릅니다.

  1. 매크로 인수 및 예외 선언

    A CATCH 매크로 호출 다음과 같은 구문이 있습니다:

    CATCH (exception_class, exception_object_pointer_name)

    클래스 이름과 개체 포인터 이름 사이 쉼표를 확인할 수 있습니다.

    예외 선언에는 catch 이 구문 키워드를 사용 하 여:

    catch (exception_typeexception_name)

    이 예외 선언문 종류의 예외를 catch 블록이 처리 합니다.

  2. Catch 블록의 delimitation.

    매크로 있는 CATCH 매크로 (인수)를 사용 하는 첫째 catch 블록; 시작 AND_CATCH 매크로 시작 이후의 catch 블록 및 END_CATCH 매크로 일련의 catch 블록을 종료 합니다.

    키워드를 사용의 catch 키워드 (예외 선언) 각 catch 블록을 시작 합니다.없음에 대응 되는 END_CATCH 매크로입니다. catch 블록의 닫는 중괄호를 끝냅니다.

  3. Throw 식:

    매크로 사용 THROW_LAST 현재 예외를 다시 throw 합니다.throw 인수가 없는 키워드는 동일한 효과가 있습니다.

변환을 수행합니다.

매크로 사용 하 여 C++ 예외 처리 키워드를 사용 하는 코드를 변환 하려면

  1. 모든 MFC 매크로 찾고 시도, CATCH, AND_CATCH, END_CATCH, THROW, 및 THROW_LAST.

  2. 바꾸기 또는 다음 매크로를 모두 삭제 합니다.

    시도 (바꿀 시도)

    CATCH (바꿀 catch)

    AND_CATCH(바꿀 catch)

    END_CATCH(삭제)

    THROW (바꿀 throw)

    THROW_LAST(바꿀 throw)

  3. 유효한 예외 선언 형성 되도록 매크로 인수를 수정 합니다.

    예를 들어, 변경

    CATCH(CException, e)
    

    를 다음으로 변경:

    catch(CException* e)
    
  4. 필요한 경우 예외 개체 삭제 되도록 catch 블록의 코드를 수정 합니다.자세한 내용은 문서를 참조 하십시오. 예외: 예외를 삭제 하 고 Catching.

MFC 예외 매크로 사용 하 여 예외 처리 코드의 예는 다음과 같습니다.다음 예제에서 코드는 예외 매크로 사용 하기 때문에 이때 e 자동으로 삭제 됩니다.

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();

   if (m_bReturnFromThisFunction)
      return;

   // Not necessary to delete the exception e.
}
END_CATCH

예외를 명시적으로 삭제 해야 하므로 다음 예제에서 코드에서는 C++ 예외 키워드를 사용 합니다.

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch(CException* e)
{
   if (m_bPassExceptionsUp)
      throw;

   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }

   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }

   e->Delete();
}

자세한 내용은 예외: MFC 매크로 사용 하 고 C++ 예외.

참고 항목

개념

MFC에서 처리 하는 예외