当前位置:  开发笔记 > 编程语言 > 正文

哪个是对的?catch(_com_error e)或catch(_com_error&e)?

如何解决《哪个是对的?catch(_com_errore)或catch(_com_error&e)?》经验,为你挑选了3个好方法。

我应该使用哪一个?

catch (_com_error e)  

要么

catch (_com_error& e)

JaredPar.. 28

第二.这是我引用萨特的尝试

"按价值投掷,参考"

学会catch正确:按值(不是指针)抛出异常并通过引用(通常是const)捕获它们.这是与异常语义最佳匹配的组合.当重新抛出同样的异常,宁愿只是throw;throw e;.

这是完整的第73项.按价值投掷,以参考方式捕获.


避免按值捕获异常的原因是它隐式地创建了异常的副本.如果异常属于子类,则有关它的信息将丢失.

try { throw MyException ("error") } 
catch (Exception e) {
    /* Implies: Exception e (MyException ("error")) */
    /* e is an instance of Exception, but not MyException */
}

通过引用捕获可以通过不复制异常来避免此问题.

try { throw MyException ("error") } 
catch (Exception& e) {
    /* Implies: Exception &e = MyException ("error"); */
    /* e is an instance of MyException */
}

始终复制该异常.这一点也很重要.即使被引用抓住了.区别在于您可以向下转换对子类型的引用,而按值捕获始终会对对象进行切片. (2认同)

另外,如"C++编码标准"中所述,你应该使用throw; 如果需要,重新抛出执行,而不是扔e; 因为多态性总是被throw保留; (但这只有在您通过引用捕获时才有用) (2认同)


jonner.. 13

就个人而言,我会选择第三种选择:

catch (const _com_error& e)


Kris Kumler.. 6

另外,请注意,使用MFC时,您可能必须通过指针捕获.否则,@ JaredPar的答案是你通常应该采用的方式(并且希望永远不必处理抛出指针的事情).



1> JaredPar..:

第二.这是我引用萨特的尝试

"按价值投掷,参考"

学会catch正确:按值(不是指针)抛出异常并通过引用(通常是const)捕获它们.这是与异常语义最佳匹配的组合.当重新抛出同样的异常,宁愿只是throw;throw e;.

这是完整的第73项.按价值投掷,以参考方式捕获.


避免按值捕获异常的原因是它隐式地创建了异常的副本.如果异常属于子类,则有关它的信息将丢失.

try { throw MyException ("error") } 
catch (Exception e) {
    /* Implies: Exception e (MyException ("error")) */
    /* e is an instance of Exception, but not MyException */
}

通过引用捕获可以通过不复制异常来避免此问题.

try { throw MyException ("error") } 
catch (Exception& e) {
    /* Implies: Exception &e = MyException ("error"); */
    /* e is an instance of MyException */
}


始终复制该异常.这一点也很重要.即使被引用抓住了.区别在于您可以向下转换对子类型的引用,而按值捕获始终会对对象进行切片.
另外,如"C++编码标准"中所述,你应该使用throw; 如果需要,重新抛出执行,而不是扔e; 因为多态性总是被throw保留; (但这只有在您通过引用捕获时才有用)

2> jonner..:

就个人而言,我会选择第三种选择:

catch (const _com_error& e)



3> Kris Kumler..:

另外,请注意,使用MFC时,您可能必须通过指针捕获.否则,@ JaredPar的答案是你通常应该采用的方式(并且希望永远不必处理抛出指针的事情).

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有