예외: 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
자세한 내용은 예외: 예외 내용 검사.