## C++ 错误处理的重新思考:支持异常 本文探讨了 C++ 中传统错误处理方法(枚举、断言、契约和 `std::expected`)的替代方案,最终重新审视了经常被忽视的异常。虽然之前的方案存在缺点(污染逻辑、需要更改签名或功能有限),但异常提供了一种出乎意料的简洁解决方案。 核心论点是异常允许编写专注于“正常流程”的代码,并将错误处理委托给 `try/catch` 块或全局处理程序。对性能的担忧在很大程度上已经过时;最近的研究(由 Khalil Estell 进行)表明,由于基于表的异常处理,现代编译器(尤其是 x64/ARM64)的开销很小。 然而,C++ 缺乏强制的异常声明(删除了 `throw` 关键字)是一个重大弱点。这需要依赖注释进行文档记录,而 Java 的检查型异常 *要求* 处理或声明。作者建议采用类似 Java 的方法:使用异常处理可恢复的错误(如文件丢失),并依赖契约/中止来处理不可恢复的问题(如设备故障)。 最终,作者提倡使用异常,因为它们简洁易读,认为它们可以产生比替代方案更清晰的代码,甚至可以改进常见的无检查错误返回,从而导致后期崩溃且堆栈跟踪信息不足的情况。