예외: MFC 매크로 및 C++ 예외 사용
이 문서에서는 MFC 예외 처리 매크로와 C++ 예외 처리 키워드(keyword) 모두 사용하는 코드 작성에 대한 고려 사항을 설명합니다.
이 문서에서는 다음 항목을 다룹니다.
예외 키워드 및 매크로 혼합
동일한 프로그램에서 MFC 예외 매크로와 C++ 예외 키워드(keyword) 혼합할 수 있습니다. 그러나 MFC 매크로를 동일한 블록의 C++ 예외 키워드(keyword) 혼합할 수는 없습니다. 예외 처리 키워드(keyword) 사용하는 코드는 예외 개체가 범위를 벗어날 때 예외 개체가 자동으로 삭제되기 때문입니다. 자세한 내용은 예외: 예외 Catch 및 삭제 문서를 참조하세요.
매크로와 키워드(keyword) 간의 기본 차이점은 예외가 범위를 벗어날 때 매크로가 catch된 예외를 "자동으로" 삭제한다는 것입니다. 키워드(keyword) 사용하는 코드는 그렇지 않습니다. catch 블록에서 catch된 예외는 명시적으로 삭제해야 합니다. 매크로와 C++ 예외 키워드(keyword) 혼합하면 예외 개체가 삭제되지 않을 때 메모리 누수 또는 예외가 두 번 삭제될 때 힙 손상이 발생할 수 있습니다.
예를 들어 다음 코드는 예외 포인터를 무효화합니다.
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 문 대신 THROW_LAST 매크로를 사용하면 "외부" 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 블록 내부 블록 사용해 보기
CATCH 블록 내에 있는 블록 내에서 현재 예외를 try
다시 throw할 수 없습니다. 다음 예제가 잘못되었습니다.
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
자세한 내용은 예외: 예외 내용 검사를 참조 하세요.