c++ - C++ 中 try/catch block 的使用

标签 c++ exception-handling try-catch

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

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

我已从文献和同事那里得到建议,以尽量减少此类代码块中的代码,我接受这通常是好的建议。

我想进一步了解上述建议的基础:

  • 开销的性质是什么?
  • 最近是否有针对 try/catch block 的推荐使用(或避免使用)的开发指南?
  • 更快的处理器和更现代的编译器在多大程度上缓解了 try/catch 的问题?

提前感谢您的帮助,

AJ

最佳答案

在 c++ 中,成本取决于实现。一般来说,实现异常有两种方式:

第一个是“表格”方法。编译器构建一组表来查找,在抛出异常的点,去哪里。当抛出异常时,它必须在调用堆栈中向上搜索每个表,直到找到可以捕获此异常的内容。由于这都是基于运行时的,因此进入或退出 try catch 不会产生任何惩罚(好),但抛出异常可能涉及许多查找,从而产生更慢的抛出。我个人更喜欢不为 try catch block 付费,因为异常应该是非常罕见的情况。如果它们必须存储表,这也会使可执行文件更大。

秒是“代码”方法。每次代码进入 try catch block 时,从概念上讲, block 的位置被压入堆栈。这会在进入和退出 try-catch block 期间产生成本,但是,当抛出异常时,运行时机制可以快速弹出堆栈以查找去向。所以,抛出异常(很多?)更快,但现在进入一个 block 是有代价的。将 try catch block 放在紧密的低级循环中可能会产生大量开销。

您必须检查您的特定编译器以查看他们使用的是哪一个。

关于c++ - C++ 中 try/catch block 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951380/

相关文章:

java - 在 try catch block 中返回。正确吗?

c++ - size_t 到 unsigned int(来自 API 函数)

C++ 头文件交叉 #include

c++ - 使用正则表达式 C++ 计算数字中的小数位

scala - 在 Scala 中选择正确的异常处理

java - 初级Java : go back to start after failed try (try contains for loop)

c# - 哪个效率更高??使用是对象和/或 try catch

c++ - 如何清除opengl着色器缓存

c# - 是否有类似(值或错误)可区分联合的 .NET 类型?

c# - await Task.WhenAll(tasks) 异常处理,记录来自任务的所有异常