当通过引用捕获异常时,我得到的唯一优势是避免创建异常对象的副本?基本上是两者之间的区别
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)会像您在此处所做的那样通过指针引发异常,并且预计会被指针捕获。
按值和按引用捕获指针之间没有有效的区别,除了如果通过引用捕获,则为您提供了删除异常、使用相同的指针分配新异常以及重新抛出相同的异常指针的(完全无用的)选项。
如果指针抛出异常,则可以避免使用引用。
如果异常是按值引发的,则确实需要引用。