在C++中使用try/catch块

AJ *_* S. 15 c++ exception-handling try-catch

一般来说,我倾向于使用try/catch代码,这些代码具有多个故障点,故障具有公共处理程序.

根据我的经验,这通常是在执行某些操作后执行某些操作或输出之前限定输入或上下文的代码.

我收到了文献和同事的建议,以尽量减少这些块中的代码,我接受这一点作为一般的好建议.

我想更多地了解上述建议的基础:

  • 开销的性质是什么?
  • 是否有最新的开发指南解决了try/catch块的建议用法(或避免)?
  • 更快的处理器和更现代的编译器可以缓解try/catch的问题?

在此先感谢您的帮助,

AJ

Tod*_*ner 17

在c ++中,成本取决于实现.通常,有两种方法可以实现异常:

首先是"表"方法.编译器构建一组表来查找,抛出异常的位置,去哪里.抛出异常时,它必须在调用堆栈中搜索每个表,直到找到可以捕获此异常的内容.由于这都是基于运行时的,因此输入或退出try catch不会产生任何惩罚(好),但抛出异常可能会导致许多查找,从而产生更慢的抛出.我个人更喜欢尝试捕获块不需要付费,因为异常应该是非常罕见的情况.如果必须存储表,这也会使可执行文件更大.

秒是"代码"方法.每次代码进入try catch块时,概念上,块的位置被压入堆栈.这会在进入和退出try-catch块时产生成本,但是,当抛出异常时,运行时机制可以快速弹出堆栈以找到去的位置.因此,抛出异常(更多?)更快,但现在进入一个区块需要付出代价.将try catch块置于紧密的低级循环中可能会产生很大的开销.

您必须检查特定的编译器以查看它们使用的编译器.


Fre*_*son 6

我找到了一份关于C++性能的技术报告(pdf警告),其中包括有关异常的部分.你可能会发现它很有趣.我有同事认为try/catch块中的每条指令都有开销,但这份技术报告似乎并不支持这个想法.


Nik*_*sov 5

你的第二个问题:一般指导原则是在这里,香草萨特也给出了相当不错的提醒在这里.


小智 0

根据我的经验,try/catch 块的最大问题是我们经常尝试过于笼统地捕获异常。例如,如果我用一个捕获 (...) 的 try/catch 块包装我的主函数,我基本上是试图不允许我的程序因抛出的异常而崩溃。

我认为这种方法的问题有两个。1)当我测试和调试时,我没有看到任何错误,也没有机会修复它们。2)这确实是一种偷懒的方式。我没有思考可能出现的问题并找出边缘情况是什么,而是努力避免失败。努力不失败与努力成功有很大不同。