예외: MFC 예외 매크로를 변환
이것은 고급 항목입니다.
이 문서에서는 Mfc 매크로로 작성 된 기존 코드를 변환 하는 방법에 설명- 시도, CATCH, THROW등-C++ 예외 처리 키워드를 사용 하 시도, catch, 및 throw.다음 내용을 다룹니다.
변환의 장점
C + + 예외를 사용 하려면 예외 매크로 코드로 변환 합니다.
변환의 이점
매크로 구현에서는 MFC 버전 3.0 및 이전 버전에서 구현 간의 차이점에 주의 해야 하지만 아마도 기존 코드를 변환할 필요는 없습니다.이러한 차이점과 바꾼 코드 동작 설명 예외: 예외 매크로 버전 3.0의 변경.
변환의 장점은 다음과 같습니다.
C + + 예외 처리 키워드를 사용 하는 코드에는 약간 더 작은 컴파일합니다.EXE 또는.DLL입니다.
C + + 예외 처리 키워드를 보다 융통성이 있습니다: 복사할 수 있는 데이터 형식의 예외를 처리할 수 있습니다 (int, float, char등) 예외 클래스에만 매크로가 처리 되는 반면, CException 및 파생 된 클래스에서.
주요 차이점은 매크로 키워드는 예외가 범위를 벗어날 때 catch 된 예외를 "자동" 매크로 사용 하 여 코드 삭제입니다.Catch 된 예외를 명시적으로 삭제 해야 하므로 코드의 키워드를 사용 하지 않습니다.자세한 내용은 문서를 참조 하십시오. 예외: 예외를 삭제 하 고 Catching.
또 다른 차이점은 구문입니다.매크로 키워드의 구문은 세 가지 면에서 다릅니다.
매크로 인수 및 예외 선언
A CATCH 매크로 호출 다음과 같은 구문이 있습니다:
CATCH (exception_class, exception_object_pointer_name)
클래스 이름과 개체 포인터 이름 사이 쉼표를 확인할 수 있습니다.
예외 선언에는 catch 이 구문 키워드를 사용 하 여:
catch (exception_typeexception_name)
이 예외 선언문 종류의 예외를 catch 블록이 처리 합니다.
Catch 블록의 delimitation.
매크로 있는 CATCH 매크로 (인수)를 사용 하는 첫째 catch 블록; 시작 AND_CATCH 매크로 시작 이후의 catch 블록 및 END_CATCH 매크로 일련의 catch 블록을 종료 합니다.
키워드를 사용의 catch 키워드 (예외 선언) 각 catch 블록을 시작 합니다.없음에 대응 되는 END_CATCH 매크로입니다. catch 블록의 닫는 중괄호를 끝냅니다.
Throw 식:
매크로 사용 THROW_LAST 현재 예외를 다시 throw 합니다.throw 인수가 없는 키워드는 동일한 효과가 있습니다.
변환을 수행합니다.
매크로 사용 하 여 C++ 예외 처리 키워드를 사용 하는 코드를 변환 하려면
모든 MFC 매크로 찾고 시도, CATCH, AND_CATCH, END_CATCH, THROW, 및 THROW_LAST.
바꾸기 또는 다음 매크로를 모두 삭제 합니다.
시도 (바꿀 시도)
CATCH (바꿀 catch)
AND_CATCH(바꿀 catch)
END_CATCH(삭제)
THROW (바꿀 throw)
THROW_LAST(바꿀 throw)
유효한 예외 선언 형성 되도록 매크로 인수를 수정 합니다.
예를 들어, 변경
CATCH(CException, e)
를 다음으로 변경:
catch(CException* e)
필요한 경우 예외 개체 삭제 되도록 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++ 예외.