在这种情况下,最合适的异常处理策略是什么?
1.将其放入最低级别并转换为普通错误条件。
优点:不需要编写异常安全代码,实现最简单,测试最容易,最容易理解,最小的编译时间信息用于展开。
缺点:看起来不太酷,添加明显的try/catch混乱 - 实际上每个插入和push_back周围都有,甚至需要编写STL容器的异常安全包装器,有人认为try块会有运行时性能损失(也有人认为根本没有损失)。
2.在顶部处理它。
优点:看起来很酷,没有混乱。
缺点:真的很难直观地验证之间的所有代码确实是异常安全的,测试所有异常展开路径将是一个挑战。
3.将其作为应用程序的完整重启在最顶层处理:清除未被异常处理清除的所有内容并重新开始。
优点:可预测,将容忍异常安全代码中的轻微瑕疵,比崩溃好得多。
缺点:过于严厉。
4.编写自定义分配器,允许在a()之前检查内存储备,然后再深入调用堆栈。
void a()
{
...
x = b();
...
}
int b()
{
y = c();
...
return y + d();
}
int d()
{
...
z = e();
...
}