共用方式為


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

這是進階主題。

本文說明如何轉換以 Microsoft Foundation Class 宏撰寫的現有程式碼 —TRY、CATCH、THROW 等等,以使用 C++ 例外狀況處理關鍵字 trycatchthrow 主題包括:

轉換的優點

您可能不需要轉換現有的程式碼,不過您應該知道 MFC 3.0 版中的宏實作與舊版中的實作之間的差異。 例外狀況: 3.0 版例外狀況宏的變更會討論這些差異和程式程式碼為的後續變更。

轉換的主要優點如下:

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

  • C++ 例外狀況處理關鍵字更為多才多藝:它們可以處理任何可複製之資料類型的例外狀況( int 、、 floatchar 等等),而宏只會處理衍生自它的類別 CException 和類別的例外狀況。

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

另一個差異是語法。 宏和關鍵字的語法在三個方面不同:

  1. 宏引數和例外狀況宣告:

    CATCH 宏調用具有下列語法:

    CATCH( exception_class,exception_object_pointer_name

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

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

    catch( exception_type exception_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 宏 TRY、CATCH、AND_CATCH、 END_CATCH THROW THROW_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++ 例外狀況

另請參閱

例外狀況處理