【问题标题】:Should I use exception handling in a program where all exceptions lead to termination?我应该在所有异常都会导致终止的程序中使用异常处理吗?
【发布时间】:2014-12-03 20:36:43
【问题描述】:

我目前正在开发一个模拟工具。该工具不是交互式的。所有可能的异常都是由于编程错误(在开发期间)或损坏的输入数据。如果发生异常,程序必须终止,因为继续运行毫无意义。

所以我有两个选择:

  1. 使用 C++ 异常处理。优点:调试时崩溃时会得到堆栈跟踪。相反:严重 (?) 性能开销。
  2. 调用终止程序的错误函数。优点:快速简单。相反:没有堆栈跟踪。

问题:对性能的影响有多严重?一些异常可能源于对时间要求非常严格的函数。

如果我的考虑有什么根本上的错误,请告诉我。

【问题讨论】:

  • 您是如何提出严重 性能开销的?典型的实现只在抛出异常时引入开销,而不是在采用非异常路径时。
  • @Praetorian:由于优化可能性降低,也会产生一些开销(这是noexcept 的一大原因)。不过仍然不是很严重。
  • 您确定不能在abort() 上获得核心转储吗?
  • 了解开销的唯一方法是执行测试并计时。我不确定为什么@Deduplicator 认为会有额外的开销(如果你需要一个 if 在 throw 之前进行测试,你还需要在调用 abort 之前进行测试,两者都会以同样的方式阻止优化)。当不抛出异常时,一般情况下的异常没有开销。当你抛出它时,额外的开销并不是真正的问题,因为你将终止应用程序。
  • 要跟踪编程级别错误,请使用assert()

标签: c++ exception-handling


【解决方案1】:

正如@doc 建议的那样,我可能会使用assert 来跟踪与输入无关的编程错误。然后我会使用异常来处理与输入相关的错误。这不仅是异常的确切用途,如果您碰巧遇到某种类型的输入错误,您可以从中恢复异常框架已经为您准备好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多