簡體   English   中英

當拋出異常指針時,為什么我應該通過引用使用catch

[英]Why should i use catch by reference when exception pointers are thrown

通過引用捕獲異常時,我得到的唯一好處是避免使用異常對象的副本? 基本上是區別

try
{
    CString a_csSQL = _T("SELECT * FROM Library");
    CDatabase aDB;
    aDB.OpenEx(g_csConnectionStringWdDSN,CDatabase::noOdbcDialog));
    aDB.ExecuteSQL(a_csSQL);
}
catch(CDBException *& ex)
{
    ex->Delete();
}

try
{
    CString a_csSQL = _T("SELECT * FROM Library");
    CDatabase aDB;
    aDB.OpenEx(g_csConnectionStringWdDSN,CDatabase::noOdbcDialog))
    aDB.ExecuteSQL(a_csSQL);
}
catch(CDBException * ex)
{
    ex->Delete();
}

您發布的兩個代碼之間的區別在於,第一個通過引用捕捉一個指向一個異常,並且由值,第二個捕獲的指針的異常。 在這兩種情況下都不會復制異常,因為您正在處理指針。

通常,異常應該按值拋出,並通過引用捕獲。 C ++標准庫的設計充分考慮了這一期望。 但是,較舊的庫(例如MFC)會像在此處一樣通過指針拋出異常,並且應該被指針捕獲。

按值和按引用捕獲指針之間沒有任何有效區別,除非您通過引用捕獲,為您提供刪除異常的(完全無用的)選項,使用相同的指針分配新異常,並重新拋出相同的異常 -指針。

如果通過指針拋出異常,則可以避免使用引用。

如果按值拋出異常,則確實需要引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM