在我们的应用程序中,我们将任何崩溃记录到包含堆栈跟踪的日志文件中。我们可以使用这些报告来确定崩溃原因。
问题是,我们倾向于在几个地方(实际上很多(捕获 std::exception,这使得报告在抛出bad_alloc时实际上毫无用处,因为堆栈跟踪丢失了。
如何改变行为,以便程序中止而不是抛出bad_alloc?当我们在 3 种不同的操作系统中编写时,因此使用了 3 种不同的 std 实现,因此我们希望避免更改 std 本身。
除了重新思考或重新设计以捕获更多定制的异常(我真的推荐(,您还有两个解决方案:
-
使用
operator new
和operator new[]
的"无投掷"变体。检查返回的空指针,然后中止。 -
设置调用
std::terminate
的new
处理程序。
我检查了异常层次结构(http://en.cppreference.com/w/cpp/error/exception(,似乎我们永远不需要捕获std::runtime_exception之外的任何内容,我们所有的内部异常类型都派生自std::runtime_exception。
所以我只是改变了我们程序中最广泛的捕获是 std::runtime_error 所以 std::bad_alloc 成为例外,我们可以妥善管理。
编辑:这只能从C++11开始使用