從 MFC 例外巨集轉換的例外狀況:
這是進階的主題。
這篇文章說明如何將現有的程式碼撰寫 Mfc 巨集轉換 — 試, 攔截, 擲回,依此類推 — 若要使用的 C++ 例外處理關鍵字然後再試, 攔截,和throw。 主題包括:
轉換的優點
轉換使用 C++ 例外狀況的例外狀況巨集的程式碼。
轉換的好處
您可能不需要轉換現有的程式碼,雖然您應該要知道在 MFC 3.0 版中的巨集實作和較早版本中的實作之間的差異。 討論這些差別及其在程式碼行為的後續變更例外狀況: 在 3.0 版例外巨集會變成。
將轉換的主要優點包括:
使用 C++ 例外處理關鍵字的程式碼會編譯為稍微比較小。EXE 或。DLL。
C + + 例外處理關鍵字會更加靈活: 所能處理例外狀況,可以複製任何資料型別 (int, 浮點數, char,依此類推),而該巨集處理例外狀況,只有類別的CException和從它衍生的類別。
巨集和關鍵字之間的區別是 「 自動地 」 使用的巨集的程式碼會刪除捕捉的例外狀況,例外狀況超出範圍時。 使用關鍵字的程式碼沒有,因此您必須明確地刪除捕捉的例外狀況。 如需詳細資訊,請參閱下面的文件的例外狀況: 攔截和刪除例外狀況。
另一個不同點是語法。 巨集和關鍵字的語法差異有三方面:
巨集引數和例外狀況宣告:
A 攔截巨集引動過程語法如下:
CATCH (exception_class, exception_object_pointer_name)
請注意 [類別名稱和物件指標名稱之間以逗點。
例外狀況宣告攔截關鍵字會使用此語法:
catch (exception_typeexception_name)
這個例外狀況宣告陳述式會指示類型的例外狀況的 catch 區塊控制代碼。
Delimitation 的 catch 區塊:
巨集, 攔截 (含引數) 的巨集開始第一個 catch 區塊中。 AND_CATCH後續的 catch 區塊開頭的巨集和END_CATCH巨集結束的 catch 區塊順序。
與關鍵字, 攔截關鍵字 (使用例外狀況宣告) 開始每一個 catch 區塊。 沒有任何對應END_CATCH巨集。 catch 區塊直到其右大括號。
擲回運算式中:
使用巨集THROW_LAST來重新擲回目前例外狀況。 throw關鍵字,與未加引數,具有相同的效果。
進行轉換
轉換程式碼使用巨集若要使用的 C++ 例外處理關鍵字
找出 MFC 巨集的所有項目試, 攔截, AND_CATCH, END_CATCH, 擲回,以及THROW_LAST。
取代或刪除下列的巨集的所有項目:
請試著(取代 試)
找出(取代 攔截)
AND_CATCH(取代攔截)
END_CATCH(刪除)
擲回 (取代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++ 例外。