3

当通过引用捕获异常时,我得到的唯一优势是避免生成异常对象的副本?基本上两者的区别

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();
}
4

2 回答 2

7

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

一般来说,异常应该按值抛出,并通过引用捕获。C++ 标准库的设计考虑了这种期望。但是,较旧的库(例如 MFC)像您在此处所做的那样通过指针引发异常,并且预计会被指针捕获。

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

于 2013-02-01T20:56:46.583 回答
0

如果异常是由指针引发的,则可以避免使用引用。

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

于 2013-02-01T20:57:25.117 回答