共用方式為


例外狀況: 使用 MFC 巨集和 C++ 例外狀況

本文將告訴您撰寫程式碼,同時使用 MFC 例外處理巨集和 C++ 例外處理關鍵字的考量因素。

本文涵蓋下列主題:

  • 混合例外關鍵字和巨集

  • 請試著 catch 區塊內的區塊

混合例外關鍵字和巨集

您可以混合 MFC 例外巨集和 C++ 例外關鍵字,在同一個程式中。 但是,您不能和 C++ 例外關鍵字,在同一個區塊中混合 MFC 巨集,因為這些巨集會刪除例外狀況物件自動時超出範圍,而不會使用例外處理關鍵字的程式碼。 如需詳細資訊,請參閱下面的文件的例外狀況: 攔截和刪除例外狀況

巨集和關鍵字的主要差別是當例外狀況超出範圍時巨集 「 自動地 」 刪除捕捉的例外狀況。 使用關鍵字的程式碼執行 ; 必須明確地刪除在 catch 區塊中攔截到例外狀況。 混合巨集和 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執行會傳用完 「 內部 」 時,就刪除攔截區塊。 使用THROW_LAST巨集,而不是擲回陳述式將會造成 「 外部 」 攔截區塊來接收有效的指標:

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

Try 區塊內 Catch 區塊

您不能重新目前例外狀況擲回在 區塊中 攔截區塊。 下列範例是無效的:

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

如需詳細資訊,請參閱的例外狀況: 檢查例外狀況內容

請參閱

概念

在 MFC 中處理的例外狀況