为什么在抛出异常指针时要通过引用使用 catch
Why should i use catch by reference when exception pointers are thrown
当通过引用捕获异常时,我得到的唯一优势是避免创建异常对象的副本?基本上是两者之间的区别
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)会像您在此处所做的那样通过指针引发异常,并且预计会被指针捕获。
按值和按引用捕获指针之间没有有效的区别,除了如果通过引用捕获,则为您提供了删除异常、使用相同的指针分配新异常以及重新抛出相同的异常指针的(完全无用的)选项。
如果指针抛出异常,则可以避免使用引用。
如果异常是按值引发的,则确实需要引用。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- std::unique_ptr 在 try-catch 块中未捕获取消引用异常
- 通过值或引用进行throw-in-catch(..)抛出
- catch 块如何捕获对其他作用域中临时变量的引用
- 在 catch 块中使用 g++ 或 clang++ 启用未引用的局部变量警告
- 通过值或引用传递C++中的默认catch-show语句
- 通过引用捕获(使用 catch)时异常对象的范围
- Try-catch不带参数,使用引用
- 在 catch 块异常中无意义地使用引用传递语法
- 为什么在抛出异常指针时要通过引用使用 catch