当通过引用捕获异常时,我得到的唯一好处是避免复制异常对象?基本上,两者的区别
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();
}发布于 2013-02-02 04:56:47
您发布的两个代码之间的不同之处在于,第一个代码通过引用捕获指向异常的指针,而第二个代码通过值捕获指向异常的指针。在这两种情况下,都不会复制异常,因为您正在处理指针。
一般而言,异常应该通过值抛出,并通过引用捕获。C++标准库在设计时就考虑到了这一点。然而,较老的库(例如MFC)会像这里一样通过指针抛出异常,并且预期会被指针捕获。
通过值捕获指针和通过引用捕获指针之间没有有效的区别,除了通过引用捕获给您提供了删除异常、分配具有相同指针的新异常以及重新抛出相同异常指针的选项(完全无用)之外。
发布于 2013-02-02 04:57:25
如果异常是由指针抛出的,则可以避免使用引用。
如果异常是通过值抛出的,那么引用确实是必需的。
https://stackoverflow.com/questions/14654752
复制相似问题