다음을 통해 공유


예외: MFC 예외 매크로에서 변환

고급 항목입니다.

이 문서에서는 MICROSOFT Foundation 클래스 매크로(TRY, CATCH, THROW 등)로 작성된 기존 코드를 변환하여 C++ 예외 처리 키워드(keyword) 사용하는 방법을 설명합니다trythrowcatch. 다룰 주제는 다음과 같습니다.

변환의 장점

MFC 버전 3.0의 매크로 구현과 이전 버전의 구현 간의 차이점을 알고 있어야 하지만 기존 코드를 변환할 필요는 없습니다. 이러한 차이점과 코드 동작의 후속 변경 내용은 예외: 버전 3.0의 예외 매크로 변경 내용에서 설명합니다.

변환의 주요 이점은 다음과 같습니다.

  • C++ 예외 처리 키워드(keyword) 사용하는 코드는 약간 더 작은 .EXE 또는 .DLL로 컴파일됩니다.

  • C++ 예외 처리 키워드(keyword) 보다 다양합니다. 복사할 수 있는 모든 데이터 형식의 예외를int 처리할 수 있는 반면 매크로floatchar는 파생된 클래스 및 클래스 CException 의 예외만 처리합니다.

매크로와 키워드(keyword) 간의 주요 차이점은 예외가 범위를 벗어날 때 매크로를 사용하는 코드가 catch된 예외를 "자동으로" 삭제한다는 것입니다. 키워드(keyword) 사용하는 코드는 그렇지 않으므로 catch된 예외를 명시적으로 삭제해야 합니다. 자세한 내용은 예외: 예외 Catch 및 삭제 문서를 참조하세요.

또 다른 차이점은 구문입니다. 매크로 및 키워드(keyword) 구문은 다음 세 가지 측면에서 다릅니다.

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

    CATCH 매크로 호출의 구문은 다음과 같습니다.

    CATCH(exception_class, exception_object_pointer_name)

    클래스 이름과 개체 포인터 이름 사이의 쉼표입니다.

    키워드(keyword) 대한 catch 예외 선언은 다음 구문을 사용합니다.

    catch(exception_typeexception_name)

    이 예외 선언문은 catch 블록이 처리하는 예외 유형을 나타냅니다.

  2. catch 블록의 구분 기호:

    매크로를 사용하면 CATCH 매크로(인수 포함)가 첫 번째 catch 블록을 시작하고, AND_CATCH 매크로는 후속 catch 블록을 시작하고, END_CATCH 매크로는 catch 블록 시퀀스를 종료합니다.

    키워드(keyword) catch 키워드(keyword)(예외 선언 포함)는 각 catch 블록을 시작합니다. END_CATCH 매크로에는 해당 항목이 없습니다. catch 블록은 닫는 중괄호로 끝납니다.

  3. throw 식:

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

변환 수행

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

  1. TRY, CATCH, AND_CATCH, END_CATCH, THROWTHROW_LAST 모든 MFC 매크로를 찾습니다.

  2. 다음 매크로의 모든 항목을 바꾸거나 삭제합니다.

    TRY (다음으로 바꾸기 try)

    CATCH(대체)catch

    AND_CATCH(대체catch)

    END_CATCH(삭제)

    THROW(대체)throw

    THROW_LAST(대체throw)

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

    예를 들어 다음을 변경합니다.

    CATCH(CException, e)
    

    수신

    catch (CException* e)
    
  4. 필요에 따라 예외 개체를 삭제할 수 있도록 catch 블록의 코드를 수정합니다. 자세한 내용은 예외: 예외 Catch 및 삭제 문서를 참조하세요.

다음은 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++ 예외 키워드(keyword) 사용하므로 예외를 명시적으로 삭제해야 합니다.

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++ 예외 사용

참고 항목

예외 처리