当抛出异常指针时,为什么我应该通过引用使用catch

时间:2013-02-01 20:49:16

标签: c++ visual-c++ exception mfc

通过引用捕获异常时,我得到的唯一好处是避免使用异常对象的副本?

之间的区别基本上
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();
}

2 个答案:

答案 0 :(得分:7)

您发布的两个代码之间的区别在于,第一个代码通过引用将指针捕获到异常,第二个代码通过引用将指针捕获到异常中值。在这两种情况下都不会复制异常,因为你正在处理指针。

通常,异常应该按值抛出,并通过引用捕获。 C ++标准库的设计充分考虑了这一期望。但是,较旧的库(例如MFC)会像这里一样通过指针抛出异常,并且应该被指针捕获。

按值和按引用捕获指针之间没有任何有效区别,除非您通过引用捕获,为您提供删除异常的(完全无用的)选项,请分配新的异常同一个指针,并重新抛出相同的异常指针。

答案 1 :(得分:0)

如果指针抛出异常,则可以避免使用引用。

如果按值抛出异常,则确实需要引用。