共用方式為


例外狀況:攔截及刪除例外狀況

下列指示和範例會示範如何攔截和刪除例外狀況。 如需 trycatch和 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 區塊中的程式碼執行。

    下列基本架構顯示如何定期安排 trycatch 區塊:

    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 例外狀況巨集

請參閱

概念

MFC 中的例外狀況處理