贝利信息

C++的异常安全保证有哪些?C++代码健壮性设计准则【异常处理】

日期:2025-12-31 00:00 / 作者:裘德小鎮的故事
异常安全保证分为基本、强、不抛异常三类:基本保证程序不崩溃且资源不泄漏;强保证操作全成功或全回退;noexcept保证函数绝不抛异常,三者共同构成C++健壮性基础。

异常安全保证不是“有没有异常处理”,而是当异常发生时,程序状态是否可控、资源是否泄漏、数据是否一致。C++ 中主要分三类保证:基本异常安全、强异常安全、不抛异常保证(noexcept)。它们共同构成代码健壮性的底层防线。

基本异常安全保证(Basic Guarantee)

这是最底线的要求:一旦异常抛出,程序不会崩溃、内存不会泄漏、对象仍处于有效但可能未定义的状态(即可以安全析构或销毁)。它不承诺恢复到异常前的状态,只确保“不崩、不漏、能收尾”。

强异常安全保证(Strong Guarantee)

更进一步:要么操作完全成功,要么状态完全回退到调用前(就像什么都没发生过)。常见于容器插入、赋值、swap 等关键操作。实现它通常靠“拷贝-交换”(copy-and-swap)或“预检查+提交”模式。

不抛异常保证(Noexcept Guarantee)

某些函数明确承诺绝不抛出异常(用 noexcept 标记),这是强异常安全的基石,也是栈展开(stack unwinding)可预测的前提。析构函数、swap、移动构造/赋值默认应是 noexcept。

异常处理设计中的实用准则

异常不是错误码替代品,也不是流程控制工具。健壮性来自设计约束,而非事后补救。

基本上就这些。异常安全不是靠 try-catch 堆出来的,而是靠 RAII 打底、noexcept 明责、接口契约清晰撑起来的。写 C++ 时多问一句:“如果这行 new 抛了,前面的 file 已打开、vector 已 push 了三个元素,会怎样?”——答案越确定,代码就越健壮。