异常处理是C++的一项语言机制,用于在程序中处理异常事件。异常事件在C++中表示为异常对象。
优点:
- 异常允许上层应用决定如何处理在底层嵌套函数中发生的 “ 不可能发生 ” 的失败,不像出错代码的记录那么模糊费解;
- 应用于其他很多现代语言中, 引入异常使得 C++ 与 Python 、 Java 及其他与 C++ 相近的语言更加兼容;
- 许多 C++ 第三方库使用异常,关闭异常将导致难以与之结合;
- 异常是解决构造函数失败的唯一方案,虽然可以通过工厂函数( factory function) 或 Init() 方法模拟异常,但他们分别需要堆分配或新的“非法”状态;
- 在测试框架( testing framework) 中,异常确实很好.
缺点:
- 在现有函数中添加 throw 语句时, 必须检查所有调用处, 即使它们至少具有基本的异常安全保护,或者程序正常结束,永远不可能捕获该异常。例如: if f() calls g() calls h(),h 抛出被 f 捕获的异常, g 就要当心了,避免没有完全清理;
- 通俗一点说,异常会导致程序控制流( control flow) 通过查看代码无法确定:函数有可能在不确定的地方返回,从而导致代码管理和调试困难,当然,你可以通过规定何时何地如何使用异常来最小化的降低开销,却给开发人员带来掌握这些规定的负担;
- 异常安全需要 RAII 和不同编码实践。轻松、正确编写异常安全代码需要大量支撑,允许使用异常;
- 加入异常使二进制执行代码体积变大,增加了编译时长(或许影响不大),还可能增加地址空间压力;
- 异常的实用性可能会刺激开发人员在不恰当的时候抛出异常,或者在不安全的地方从异常中恢复,例如,非法用户输入可能导致抛出异常。如果允许使用异常会使得这样一篇编程风格指南长出很多。