当通过引用捕获异常时,我获得的唯一优势是避免创建异常对象的拷贝?基本区别
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();
}
最佳答案
您发布的两个代码之间的区别在于,第一个代码通过引用捕获指向异常的指针,第二个代码通过引用捕获指向异常的指针值(value)。在这两种情况下都不会复制异常,因为您正在处理指针。
通常,异常应该按值抛出,并按引用捕获。 C++ 标准库的设计考虑到了这一期望。但是,较旧的库(例如 MFC)像您在此处所做的那样通过指针 抛出异常,并且预计会被指针捕获。
按值和按引用捕获指针之间没有有效的区别,除非你按引用捕获,这给你删除异常的(完全无用的)选项,分配一个新的异常相同的指针,并重新抛出相同的异常指针。
关于c++ - 为什么在抛出异常指针时我应该使用引用捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14654752/