例外狀況:使用 MFC 巨集和 C++ 例外狀況
本文討論撰寫使用 MFC 例外狀況處理宏和 C++ 例外狀況處理關鍵字的程式碼的考慮。
本文涵蓋下列主題:
混合例外狀況關鍵字和宏
您可以在相同的程式中混合 MFC 例外狀況宏和 C++ 例外狀況關鍵字。 但是您無法將 MFC 宏與相同區塊中的 C++ 例外狀況關鍵字混合在一起,因為宏會在超出範圍時自動刪除例外狀況物件,而使用例外狀況處理關鍵字的程式碼則不會。 如需詳細資訊,請參閱例外狀況:攔截和刪除例外狀況一 文 。
宏和關鍵字之間的主要差異在於宏「自動」刪除例外狀況超出範圍時攔截的例外狀況。 使用 關鍵字的程式碼不會;攔截區塊中攔截到的例外狀況必須明確刪除。 混合宏和 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 語句會導致 「outer」 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 區塊內的區塊內 try
重新擲回目前的例外狀況 。 下列範例無效:
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
如需詳細資訊,請參閱 例外狀況:檢查例外狀況 內容。