例外狀況: 使用 MFC 巨集和 C++ 例外狀況
本文將告訴您撰寫程式碼,同時使用 MFC 例外處理巨集和 C++ 例外處理關鍵字的考量因素。
本文涵蓋下列主題:
混合例外關鍵字和巨集
請試著 catch 區塊內的區塊
混合例外關鍵字和巨集
您可以混合 MFC 例外巨集和 C++ 例外關鍵字,在同一個程式中。但是,您不能和 C++ 例外關鍵字,在同一個區塊中混合 MFC 巨集,因為這些巨集會刪除例外狀況物件自動時超出範圍,而不會使用例外處理關鍵字的程式碼。如需詳細資訊,請參閱下面的文件的例外狀況: 攔截和刪除例外狀況。
巨集和關鍵字的主要差別是當例外狀況超出範圍時巨集 「 自動地 」 刪除捕捉的例外狀況。使用關鍵字的程式碼執行 ; 必須明確地刪除在 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執行會傳用完 「 內部 」 時,就刪除攔截區塊。使用THROW_LAST巨集,而不是擲回陳述式將會造成 「 外部 」 攔截區塊來接收有效的指標:
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
Try 區塊內 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
如需詳細資訊,請參閱的例外狀況: 檢查例外狀況內容。