例外狀況:攔截及刪除例外狀況
下列指示和範例會示範如何攔截和刪除例外狀況。 如需 try, catch和 throw 關鍵字,請參閱 C++ 例外狀況處理。。
每當程式碼攔截例外狀況時,被處理的例外狀況處理常式必須刪除例外狀況物件,因為無法刪除例外狀況就會造成記憶體遺漏 (Memory Leak)。
您的 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 區塊的例外處理程式碼。 只有在 try 區塊中的程式碼擲回在 catch陳述式,指定之型別的例外狀況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 例外狀況巨集。