共用方式為


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

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

本文包括下列主題:

  • 混合例外狀況關鍵字和巨集

  • 在 catch 區塊內 try 區塊

混合例外狀況關鍵字和巨集

您可以混合 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 會刪除,當執行傳入「內部」 CATCH 區塊。 使用而非 THROW 陳述式的 THROW_LAST 巨集會造成「extern」 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

在 catch 區塊內 try 區塊

您不能重新擲回目前的例外狀況是在 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

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

請參閱

概念

MFC 中的例外狀況處理