共用方式為


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

這是進階的主題。

這篇文章說明如何將現有的程式碼撰寫 Mfc 巨集轉換 — 攔截擲回,依此類推 — 若要使用的 C++ 例外處理關鍵字然後再試攔截,和throw。 主題包括:

  • 轉換的優點

  • 轉換使用 C++ 例外狀況的例外狀況巨集的程式碼。

轉換的好處

您可能不需要轉換現有的程式碼,雖然您應該要知道在 MFC 3.0 版中的巨集實作和較早版本中的實作之間的差異。 討論這些差別及其在程式碼行為的後續變更例外狀況: 在 3.0 版例外巨集會變成

將轉換的主要優點包括:

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

  • C + + 例外處理關鍵字會更加靈活: 所能處理例外狀況,可以複製任何資料型別 (int, 浮點數, char,依此類推),而該巨集處理例外狀況,只有類別的CException和從它衍生的類別。

巨集和關鍵字之間的區別是 「 自動地 」 使用的巨集的程式碼會刪除捕捉的例外狀況,例外狀況超出範圍時。 使用關鍵字的程式碼沒有,因此您必須明確地刪除捕捉的例外狀況。 如需詳細資訊,請參閱下面的文件的例外狀況: 攔截和刪除例外狀況

另一個不同點是語法。 巨集和關鍵字的語法差異有三方面:

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

    A 攔截巨集引動過程語法如下:

    CATCH (exception_classexception_object_pointer_name)

    請注意 [類別名稱和物件指標名稱之間以逗點。

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

    catch (exception_typeexception_name)

    這個例外狀況宣告陳述式會指示類型的例外狀況的 catch 區塊控制代碼。

  2. Delimitation 的 catch 區塊:

    巨集, 攔截 (含引數) 的巨集開始第一個 catch 區塊中。 AND_CATCH後續的 catch 區塊開頭的巨集和END_CATCH巨集結束的 catch 區塊順序。

    與關鍵字, 攔截關鍵字 (使用例外狀況宣告) 開始每一個 catch 區塊。 沒有任何對應END_CATCH巨集。 catch 區塊直到其右大括號。

  3. 擲回運算式中:

    使用巨集THROW_LAST來重新擲回目前例外狀況。 throw關鍵字,與未加引數,具有相同的效果。

進行轉換

轉換程式碼使用巨集若要使用的 C++ 例外處理關鍵字

  1. 找出 MFC 巨集的所有項目攔截AND_CATCHEND_CATCH擲回,以及THROW_LAST

  2. 取代或刪除下列的巨集的所有項目:

    請試著(取代 )

    找出(取代 攔截)

    AND_CATCH(取代攔截)

    END_CATCH(刪除)

    擲回 (取代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++ 例外

請參閱

概念

在 MFC 中處理的例外狀況