例外狀況:攔截及刪除例外狀況
下列指示和範例示範如何攔截和刪除例外狀況。 如需 、 catch
和 關鍵字的詳細資訊 try
,請參閱 例外狀況和錯誤處理 的新式 throw
C++ 最佳做法。
您的例外狀況處理常式必須刪除其所處理的例外狀況物件,因為每當程式碼攔截例外狀況時,若無法刪除例外狀況就會導致記憶體流失。
當下列狀況時,您的 catch
區塊必須刪除例外狀況:
區塊
catch
會擲回新的例外狀況。當然,如果您再次擲回相同的例外狀況,則不得刪除例外狀況:
catch (CException* e) { if (m_bThrowExceptionAgain) throw; // Do not delete e else e->Delete(); }
執行會從 區塊內
catch
傳回。
注意
刪除 CException
時,請使用 Delete
成員函式來刪除例外狀況。 請勿使用 delete
關鍵字,因為如果例外狀況不在堆積上,它可能會失敗。
攔截和刪除例外狀況
try
使用 關鍵字來設定try
區塊。 執行任何可能會在區塊內擲回例外狀況try
的程式語句。catch
使用 關鍵字來設定catch
區塊。 將例外狀況處理常式代碼放在 區塊中catch
。 只有在 區塊內的catch
try
程式碼擲回 語句中指定的型別例外狀況時,才會執行 區塊中的catch
程式碼。下列基本架構示範如何
try
catch
和 區塊通常會排列:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CException* e) { // Handle the exception here. // "e" contains information about the exception. e->Delete(); }
擲回例外狀況時,控制項會傳遞至例外狀況宣告符合例外狀況類型的第一個
catch
區塊。 您可以使用循序catch
區塊選擇性地處理不同類型的例外狀況,如下所示:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CMemoryException* e) { // Handle the out-of-memory exception here. e->Delete(); } catch (CFileException* e) { // Handle the file exceptions here. e->Delete(); } catch (CException* e) { // Handle all other types of exceptions here. e->Delete(); }
如需詳細資訊,請參閱 例外狀況:從 MFC 例外狀況宏 轉換。