0

0

c++ 异常处理方法 c++如何正确使用try-catch

星降

星降

发布时间:2026-03-16 21:00:15

|

364人浏览过

|

来源于php中文网

原创

C++异常处理应优先使用const&捕获、析构函数禁抛异常、依赖RAII而非try-catch、避免误用uncaught_exception。

c++ 异常处理方法 c++如何正确使用try-catch

catch 里别用值传递捕获异常对象

直接拷贝异常对象可能触发额外构造/析构,甚至引发新异常。更糟的是,如果基类 catch 按值接收,派生类异常会被切片,丢失类型信息和成员数据。

  • 一律用 const& 捕获:比如 catch (const std::exception& e)
  • 自定义异常类确保拷贝构造函数不抛异常(标记 noexcept
  • 避免 catch (std::exception e)catch (MyError e) 这类写法

不要在析构函数里 throw 异常

C++ 标准规定:析构函数默认是 noexcept(true),一旦抛出未捕获异常,程序直接调用 std::terminate() —— 不会栈展开,不会执行后续析构,静默崩溃。

  • 析构函数内所有可能抛异常的操作必须用 try-catch 吞掉或转为日志
  • std::ofstream::close() 这种可能失败的调用,要检查 fail() 而非依赖异常
  • 若真需报告错误,改用返回状态码或发信号,别 throw

std::terminate 和 uncaught_exception 的实际意义很有限

std::set_terminate() 看似能兜底,但发生时往往已无法安全恢复;std::uncaught_exception() 在 C++17 起已被弃用,因为它的行为在栈展开中途不可靠。

  • 别指望 std::set_terminate 做清理工作——此时栈已停止展开,this、局部变量、RAII 对象都不可靠
  • 需要“有异常时做某事”,应使用 std::uncaught_exceptions()(C++17 新版,返回当前未处理异常数量)
  • 常见误用:在 RAII 析构里靠 uncaught_exception() 判断是否回滚事务——它在异常传播中可能返回 false,导致漏处理

资源管理比 try-catch 更重要

很多人一上来就堆 try-catch,结果逻辑分散、重复清理、掩盖设计缺陷。C++ 的异常安全核心其实是 RAII,不是 catch。

叮当好记-AI音视频转图文
叮当好记-AI音视频转图文

AI音视频转录与总结,内容学习效率 x10!

下载

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

  • 优先用 std::unique_ptrstd::lock_guardstd::fstream 等自动管理资源,而不是在 catch 里手动 deleteclose()
  • 函数接口设计上,明确哪些函数可能 throw(加注释或文档),调用方按需处理,不是每个函数都套一层 try
  • 日志、监控、超时等非核心路径错误,考虑用 std::optional 或错误码返回,避免异常开销和传播不确定性

异常机制本身没问题,问题常出在把异常当控制流、绕过资源生命周期管理、或者在不允许抛异常的地方硬 throw —— 这些地方比怎么写 catch 更容易出事。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

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

565

2023.09.20

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2003

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

681

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2438

2025.12.29

java接口相关教程
java接口相关教程

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

49

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.5万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.2万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号