這是進階主題。
本文說明如何轉換以 Microsoft Foundation Class 巨集撰寫的現有程式代碼,例如 TRY、 CATCH、 THROW 等,以使用C++例外狀況處理關鍵詞 try、 catch和 throw。 主題包括:
轉換的優點
您可能不需要轉換現有的程式代碼,不過您應該知道 MFC 3.0 版中的巨集實作與舊版中的實作之間的差異。 在《例外:版本 3.0 中的例外巨集變更》中,討論了這些差異及程式碼行為的後續變化。
轉換的主要優點如下:
使用C++例外狀況處理關鍵詞的程式代碼會編譯為稍微較小的.EXE或.DLL。
C++例外狀況處理關鍵詞更為多才多藝:它們可以處理任何可複製之數據類型的例外狀況(
int、float、char等),而巨集只會處理衍生自它的類別CException和類別的例外狀況。
巨集與關鍵詞之間的主要差異在於,當例外狀況超出範圍時,使用巨集的程序代碼會「自動」刪除攔截的例外狀況。 使用 關鍵字的程式代碼不會,因此您必須明確刪除攔截的例外狀況。 如需詳細資訊,請參閱 例外狀況:攔截和刪除例外狀況一文。
另一個差異是語法。 巨集與關鍵詞的語法差異在於三個方面:
宏指令參數和異常宣告:
CATCH 巨集調用具有下列語法:
CATCH(exception_class, exception_object_pointer_name)
請注意類別名稱和物件指標名稱之間的逗號。
關鍵詞的
catch例外狀況宣告會使用此語法:catch(exception_typeexception_name)
這個例外狀況宣告語句表示 catch 區塊處理的例外狀況類型。
catch 區塊的界限設定:
使用巨集時, CATCH 巨集(及其自變數)會開始第一個 catch 區塊: AND_CATCH 巨集會開始後續 catch 區塊, END_CATCH 巨集會終止 catch 區塊的順序。
使用 關鍵詞時,
catch關鍵詞 (其例外狀況宣告) 會開始每個 catch 區塊。 END_CATCH 巨集沒有對應的等價物。catch 區塊的結尾是其右大括弧。throw 表達式:
巨集會使用 THROW_LAST 重新擲回目前的例外狀況。 沒有
throw自變數的 關鍵詞具有相同的效果。
執行轉換
若要使用巨集轉換程序代碼,以使用C++例外狀況處理關鍵詞
找出所有出現的 MFC 巨集 TRY、 CATCH、 AND_CATCH、 END_CATCH、 THROW 和 THROW_LAST。
將下列巨集的所有出現替換或刪除。
TRY (將它取代為
try)CATCH (將它取代為
catch)AND_CATCH (將它取代為
catch)END_CATCH (刪除它)
THROW (將它取代為
throw)THROW_LAST (將它取代為
throw)修改巨集自變數,使其形成有效的例外狀況宣告。
例如,
CATCH(CException, e)至
catch (CException* e)修改 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++例外狀況。