共用方式為


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

本文討論撰寫使用 MFC 例外狀況處理巨集和C++例外狀況處理關鍵詞的程式代碼的考慮。

本文涵蓋下列主題:

混合異常關鍵詞和巨集

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

巨集和關鍵詞之間的主要差異在於,當例外狀況超出範疇時,巨集會「自動」刪除已攔截的例外狀況。 使用關鍵字的程式碼不作用; 在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 巨集,而不是 THROW 語句,會導致“outer” CATCH 區塊接收有效的指標:

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 區塊中的 區塊內重新擲回目前的例外狀況。 下列範例無效:

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

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

另請參閱

例外狀況處理