讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ 异常处理机制(Exception Handling)是什么?(如何编写异常安全的程序)

秋枫吖_6067

秋枫吖_6067

发布时间:2026-02-25 11:18:11

|

906人浏览过

|

来源于php中文网

原创

C++异常处理要求throw与catch类型精确匹配,禁止隐式转换和多态转型;析构函数严禁抛异常;异常安全分三级,推荐复制-交换等手法实现强保证;禁用-fno-exceptions除非裸机等特殊场景。

c++ 异常处理机制(exception handling)是什么?(如何编写异常安全的程序)

throw 和 catch 必须类型匹配,否则异常会直接终止程序

很多初学者以为 catch (int) 能捕获所有数值型异常,其实不然——C++ 的异常匹配是静态、精确的,不进行隐式转换(比如 short 不会自动转成 int),也不支持多态向上转型(除非 catch 写的是引用或指针)。常见错误现象是:明明抛了 std::runtime_error,却写了 catch (std::exception)(值传递),导致对象被切片,丢失派生类信息。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 总是用 catch (const std::exception& e) 捕获标准异常,避免切片和拷贝开销
  • 自定义异常类务必继承 std::exception 或其子类,并重载 what()
  • 不要依赖 catch (...) 做“兜底”——它无法获取异常信息,且掩盖了类型设计问题
  • 编译时加 -fexceptions(GCC/Clang 默认开启,但交叉编译或嵌入式环境可能关闭)

析构函数里 throw 会导致 std::terminate 立即调用

C++ 明确禁止在析构函数中抛出未捕获的异常。一旦发生,程序直接调用 std::terminate(默认行为是 abort),没有回溯、没有日志、不可恢复。这不是风格问题,是语言硬性约束。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 析构函数必须是 noexcept(C++11 起默认隐式添加,显式写出来更清晰)
  • 如果析构中可能出错(比如关闭文件、释放网络连接),把可能失败的操作移到普通成员函数中,由用户显式调用并处理异常
  • 实在需要记录错误(如日志),改用 std::cerr 或回调,绝不能 throw
  • RAII 对象(如 std::fstream)内部已遵守该规则,放心使用

异常安全有三个等级,强异常安全最难保证但最值得追求

“异常安全”不是非黑即白的概念,而是分层的:基本保证(不泄露资源、对象仍可析构)、强烈保证(操作失败则状态回滚到调用前)、不抛异常保证(如 swap、move 构造)。很多人误以为只要没内存泄漏就算安全,其实逻辑一致性更重要。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 优先用“复制-交换”(copy-and-swap)惯用法实现赋值运算符:先构造新副本,再交换,失败则旧对象不受影响
  • 避免在构造函数体中做可能失败的初始化;改用成员初始化列表 + std::unique_ptr 管理堆资源,靠 RAII 自动回滚
  • 容器操作(如 std::vector::push_back)只提供基本异常安全,扩容失败时已有元素仍有效,但新元素未插入——别假设它能回滚整个序列
  • 第三方库文档若未明确声明异常安全等级,按“基本保证”处理

启用异常会略微增加二进制体积和运行时开销,但现代编译器优化后影响极小

有人因担心性能禁用异常(-fno-exceptions),结果发现 std::optional、std::variant、甚至某些 STL 实现(如 libc++ 的 std::thread)都依赖异常机制,强行关闭会导致链接失败或未定义行为。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 仅在裸机、内核模块、或硬实时系统等明确禁止异常的场景才关掉;普通应用别碰 -fno-exceptions
  • 异常开销主要在“抛出路径”(stack unwinding),而非 try 块本身——没异常时几乎零成本
  • 若真遇到 unwind 性能瓶颈(如高频错误路径),说明设计有问题:该用返回码或 std::expected(C++23)的地方用了异常
  • 调试时可用 __cxa_throw 符号下断点,观察异常实际抛出处

异常安全真正的难点不在语法,而在状态管理边界——你得清楚每一行代码执行后对象处于什么状态,而异常会让控制流跳转得毫无征兆。越是封装好的类,越容易藏匿未考虑异常路径的资源操作。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6264

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3304

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1872

2025.10.17

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2358

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7059

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3385

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4428

2025.08.29

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn