【问题标题】:How to achieve, that bad-alloc aborts instead of throwing an exception如何实现,bad-alloc 中止而不是抛出异常
【发布时间】:2017-07-31 12:59:48
【问题描述】:

在我们的应用程序中,我们将任何崩溃记录到包含堆栈跟踪的日志文件中。我们可以使用这些报告来确定崩溃原因。

问题是,我们倾向于在几个地方(实际上很多地方)捕获 std::exception,这使得在抛出 bad_alloc 时报告实际上毫无用处,因为堆栈跟踪丢失了。

如何改变行为,而不是抛出 bad_alloc,程序中止?由于我们在 3 种不同的操作系统中编写,因此使用了 3 种不同的 std 实现,我们希望避免更改 std 本身。

【问题讨论】:

  • 也许您应该重新考虑您的设计,以捕获std::exception,而不是捕获更多特定异常?捕捉std::exception 几乎和捕捉... IMO 一样糟糕。

标签: c++ exception bad-alloc


【解决方案1】:

除了重新思考或重新设计以捕获更多定制的异常(我非常推荐)之外,您还有两个解决方案:

  1. 使用operator new and operator new[] 的“不抛出”变体。检查返回的空指针,然后中止。

  2. Set a new handler 调用std::terminate

【讨论】:

    【解决方案2】:

    我检查了异常层次结构 (http://en.cppreference.com/w/cpp/error/exception),似乎我们不需要捕获 std::runtime_exception 之外的任何内容,并且我们所有的内部异常类型都派生自 std::runtime_exception。

    所以我只是改变了我们程序中最广泛的捕获是 std::runtime_error 所以 std::bad_alloc 变成了异常,我们可以正确管理。

    编辑:这只能从 C++11 开始使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 2012-01-24
      • 1970-01-01
      • 2017-04-01
      • 2012-03-19
      • 2013-02-09
      • 1970-01-01
      • 2013-03-14
      相关资源
      最近更新 更多