sur*_*ega 3 c++ mfc exception visual-c++
通过引用捕获异常时,我得到的唯一好处是避免使用异常对象的副本?基本上是区别
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();
}
Run Code Online (Sandbox Code Playgroud)
和
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();
}
Run Code Online (Sandbox Code Playgroud)
您发布的两个代码之间的区别在于,第一个捕获一个指针通过参考一个异常,而第二个捕获一个指针通过值的异常.在这两种情况下都不会复制异常,因为您正在处理指针.
通常,异常应该按值抛出,并通过引用捕获.C++标准库的设计充分考虑了这一期望.但是,较旧的库(例如MFC)会像在此处一样通过指针抛出异常,并且应该被指针捕获.
按值和按引用捕获指针之间没有任何有效区别,除非您通过引用捕获,为您提供删除异常的(完全无用的)选项,使用相同的指针分配新异常,并重新抛出相同的异常 -指针.