如何实现,bad-alloc 中止而不是抛出异常
How to achieve, that bad-alloc aborts instead of throwing an exception
在我们的应用程序中,我们将所有崩溃记录到包含堆栈跟踪的日志文件中。我们可以使用这些报告来确定崩溃原因。
问题是,我们往往会在几个地方(实际上很多地方)捕获 std::exception,这使得报告在抛出 bad_alloc 时实际上毫无用处,因为堆栈跟踪丢失了。
如何改变行为,而不是抛出 bad_alloc,程序中止?由于我们在 3 种不同的操作系统中编写,因此使用了 3 种不同的标准实现,我们希望避免更改标准本身。
除了重新思考或重新设计以捕获更多量身定制的异常(我强烈推荐)之外,您还有两个解决方案:
使用 operator new
and operator new[]
的 "no-throw" 变体。检查返回的空指针,然后中止。
Set a new
handler that calls std::terminate
.
我检查了异常层次结构 (http://en.cppreference.com/w/cpp/error/exception),似乎我们永远不需要捕获 std::runtime_exception 之外的任何东西,并且我们所有的内部异常类型都派生自 std::runtime_exception。
所以我只是改变了我们程序中最广泛的捕获是 std::runtime_error 所以 std::bad_alloc 成为例外,我们可以适当地管理它。
编辑:这只能从 C++11 开始使用
在我们的应用程序中,我们将所有崩溃记录到包含堆栈跟踪的日志文件中。我们可以使用这些报告来确定崩溃原因。
问题是,我们往往会在几个地方(实际上很多地方)捕获 std::exception,这使得报告在抛出 bad_alloc 时实际上毫无用处,因为堆栈跟踪丢失了。
如何改变行为,而不是抛出 bad_alloc,程序中止?由于我们在 3 种不同的操作系统中编写,因此使用了 3 种不同的标准实现,我们希望避免更改标准本身。
除了重新思考或重新设计以捕获更多量身定制的异常(我强烈推荐)之外,您还有两个解决方案:
使用
operator new
andoperator new[]
的 "no-throw" 变体。检查返回的空指针,然后中止。Set a
new
handler that callsstd::terminate
.
我检查了异常层次结构 (http://en.cppreference.com/w/cpp/error/exception),似乎我们永远不需要捕获 std::runtime_exception 之外的任何东西,并且我们所有的内部异常类型都派生自 std::runtime_exception。
所以我只是改变了我们程序中最广泛的捕获是 std::runtime_error 所以 std::bad_alloc 成为例外,我们可以适当地管理它。
编辑:这只能从 C++11 开始使用