c++ - 为什么在抛出异常指针时我应该使用引用捕获

标签 c++ visual-c++ exception mfc

当通过引用捕获异常时,我获得的唯一优势是避免创建异常对象的拷贝?基本区别

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/

相关文章:

java - 我应该如何解决 java.lang.IllegalArgumentException : protocol = https host = null Exception?

C# VS2012 stacktrace 行是错误的

c++ - 将方法传递给方法并替换(几乎完全相同的)重复代码

c++ - Clang-Tidy:检查函数中的行数

c - 从文件夹加载图像(使用 C、OpenCV、Visual Studio 2008)

c++ - 不要在发布时显示控制台窗口但在调试时显示

winapi - 如何从 Windows 7 中的驱动器号中获取可移动设备的物理驱动器号?

haskell - 为什么 `mask_` 会中和 `timeout` ?

c++ - 使用花括号分隔我想在 C++ 中多次使用的变量

c++ - 如何对内部模板类使用重新解释强制转换?