共用方式為


例外狀況:從 MFC 例外狀況巨集轉換

這是進階主題。

本文說明如何轉換以 Microsoft Foundation Class 巨集撰寫的現有程式代碼,例如 TRYCATCHTHROW 等,以使用C++例外狀況處理關鍵詞 trycatchthrow。 主題包括:

轉換的優點

您可能不需要轉換現有的程式代碼,不過您應該知道 MFC 3.0 版中的巨集實作與舊版中的實作之間的差異。 在《例外:版本 3.0 中的例外巨集變更》中,討論了這些差異及程式碼行為的後續變化。

轉換的主要優點如下:

  • 使用C++例外狀況處理關鍵詞的程式代碼會編譯為稍微較小的.EXE或.DLL。

  • C++例外狀況處理關鍵詞更為多才多藝:它們可以處理任何可複製之數據類型的例外狀況(intfloatchar等),而巨集只會處理衍生自它的類別 CException 和類別的例外狀況。

巨集與關鍵詞之間的主要差異在於,當例外狀況超出範圍時,使用巨集的程序代碼會「自動」刪除攔截的例外狀況。 使用 關鍵字的程式代碼不會,因此您必須明確刪除攔截的例外狀況。 如需詳細資訊,請參閱 例外狀況:攔截和刪除例外狀況一文。

另一個差異是語法。 巨集與關鍵詞的語法差異在於三個方面:

  1. 宏指令參數和異常宣告:

    CATCH 巨集調用具有下列語法:

    CATCH(exception_class, exception_object_pointer_name)

    請注意類別名稱和物件指標名稱之間的逗號。

    關鍵詞的 catch 例外狀況宣告會使用此語法:

    catch(exception_typeexception_name

    這個例外狀況宣告語句表示 catch 區塊處理的例外狀況類型。

  2. catch 區塊的界限設定:

    使用巨集時, CATCH 巨集(及其自變數)會開始第一個 catch 區塊: AND_CATCH 巨集會開始後續 catch 區塊, END_CATCH 巨集會終止 catch 區塊的順序。

    使用 關鍵詞時, catch 關鍵詞 (其例外狀況宣告) 會開始每個 catch 區塊。 END_CATCH 巨集沒有對應的等價物。catch 區塊的結尾是其右大括弧。

  3. throw 表達式:

    巨集會使用 THROW_LAST 重新擲回目前的例外狀況。 沒有 throw 自變數的 關鍵詞具有相同的效果。

執行轉換

若要使用巨集轉換程序代碼,以使用C++例外狀況處理關鍵詞

  1. 找出所有出現的 MFC 巨集 TRYCATCHAND_CATCHEND_CATCHTHROWTHROW_LAST

  2. 將下列巨集的所有出現替換或刪除。

    TRY (將它取代為 try

    CATCH (將它取代為 catch

    AND_CATCH (將它取代為 catch

    END_CATCH (刪除它)

    THROW (將它取代為 throw

    THROW_LAST (將它取代為 throw

  3. 修改巨集自變數,使其形成有效的例外狀況宣告。

    例如,

    CATCH(CException, e)
    

    catch (CException* e)
    
  4. 修改 catch 區塊中的程式代碼,以便視需要刪除例外狀況物件。 如需詳細資訊,請參閱 例外狀況:攔截和刪除例外狀況一文。

以下是使用 MFC 例外狀況巨集處理程式碼的範例。 請注意,由於下列範例中的程式代碼會使用巨集,因此例外e會被自動刪除。

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();

   if (m_bReturnFromThisFunction)
      return;

   // Not necessary to delete the exception e.
}
END_CATCH

下一個範例中的程式代碼會使用 C++ 例外狀況關鍵詞,因此必須明確刪除例外狀況:

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch (CException* e)
{
   if (m_bPassExceptionsUp)
      throw;

   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }

   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }

   e->Delete();
}

如需詳細資訊,請參閱 例外狀況:使用 MFC 巨集和C++例外狀況

另請參閱

例外狀況處理