例外狀況:從 MFC 例外狀況巨集轉換
這是進階主題。
本文說明如何轉換以 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_type exception_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++ 例外狀況 。