共用方式為


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

下列指示和範例示範如何攔截和刪除例外狀況。 如需 、 catch 和 關鍵字的詳細資訊 try ,請參閱 例外狀況和錯誤處理 的新式 throw C++ 最佳做法。

您的例外狀況處理常式必須刪除其所處理的例外狀況物件,因為每當程式碼攔截例外狀況時,若無法刪除例外狀況就會導致記憶體流失。

當下列狀況時,您的 catch 區塊必須刪除例外狀況:

  • 區塊 catch 會擲回新的例外狀況。

    當然,如果您再次擲回相同的例外狀況,則不得刪除例外狀況:

    catch (CException* e)
    {
       if (m_bThrowExceptionAgain)
          throw; // Do not delete e
       else
          e->Delete();
    }
    
  • 執行會從 區塊內 catch 傳回。

注意

刪除 CException 時,請使用 Delete 成員函式來刪除例外狀況。 請勿使用 delete 關鍵字,因為如果例外狀況不在堆積上,它可能會失敗。

攔截和刪除例外狀況

  1. 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 例外狀況宏 轉換。

另請參閱

例外狀況處理