全面理解-c++中的异常处理机制
C++ 的异常处理机制是一种用于处理程序运行时错误的结构化方法,通过分离正常逻辑与错误处理代码,提高代码的可读性和可维护性。以下是其核心组成部分和工作原理的详细说明:
1. 异常处理的三大关键字
1.1 try 块
-
作用:包裹可能抛出异常的代码段。
-
语法:
try {// 可能抛出异常的代码 }
1.2 throw 表达式
-
作用:抛出异常对象(可以是任意类型,但通常继承自
std::exception)。 -
语法:
throw exception_object;
1.3 catch 块
-
作用:捕获并处理特定类型的异常。
-
语法:
catch (ExceptionType1& e) {// 处理 ExceptionType1 异常 } catch (ExceptionType2& e) {// 处理 ExceptionType2 异常 } catch (...) { // 捕获所有异常// 处理未知异常 }
2. 异常处理流程
-
抛出异常:代码执行到
throw时,立即停止当前函数,开始栈展开(Stack Unwinding)。 -
栈展开:
-
析构当前作用域的局部对象(按构造逆序)。
-
沿调用链向上查找匹配的
catch块。
-
-
捕获异常:找到第一个匹配的
catch块后执行其代码。 -
未捕获异常:若未找到匹配的
catch块,调用std::terminate()终止程序。
3. 异常类型与捕获方式
3.1 标准异常类
C++ 标准库定义了一组异常类(位于 <stdexcept> 头文件),均继承自 std::exception:
-
std::logic_error:程序逻辑错误(如std::invalid_argument)。 -
std::runtime_error:运行时错误(如std::overflow_error)。 -
自定义异常通常继承自
std::exception:class MyException : public std::exception { public:const char* what() const noexcept override {return "My custom exception";} };
3.2 捕获方式
-
按值捕获:拷贝异常对象(可能引发切片问题)。
-
按引用捕获:避免拷贝,保留多态性(推荐)。
-
按指针捕获:需手动管理内存(不推荐)。
-
捕获所有异常:
catch (...)(通常用于日志记录或资源清理)。
4. 异常安全性
函数在抛出异常时需保证资源不泄漏,分为三个级别:
-
基本保证(Basic Guarantee):异常发生后,程序处于合法状态。
-
强保证(Strong Guarantee):操作要么完全成功,要么回滚到操作前的状态(事务语义)。
-
不抛保证(No-throw Guarantee):承诺不抛出任何异常(用
noexcept标记)。
5. 关键机制与注意事项
5.1 noexcept 关键字
-
作用:声明函数不会抛出异常,帮助编译器优化代码。
-
语法:
void func() noexcept; // C++11 起
5.2 栈展开与析构
-
RAII(Resource Acquisition Is Initialization):依赖对象的析构函数自动释放资源(如智能指针、文件句柄)。
-
避免在析构函数中抛出异常:可能导致程序终止。
5.3 性能影响
-
零开销原则:无异常时代码无额外开销。
-
抛出异常时开销较大:涉及栈展开和类型匹配,避免频繁使用异常处理常规逻辑。
6. 代码示例
6.1 基本用法
#include <iostream>
#include <stdexcept>void riskyOperation(int value) {if (value < 0) {throw std::invalid_argument("Value cannot be negative");}// 其他操作
}int main() {try {riskyOperation(-5);} catch (const std::invalid_argument& e) {std::cerr << "Error: " << e.what() << std::endl;} catch (...) {std::cerr << "Unknown error occurred" << std::endl;}return 0;
}
6.2 自定义异常
#include <exception>
#include <string>class NetworkError : public std::exception {
private:std::string message;
public:NetworkError(const std::string& msg) : message(msg) {}const char* what() const noexcept override {return message.c_str();}
};void connectToServer() {throw NetworkError("Connection timeout");
}
7. 最佳实践
-
优先使用标准异常类型,保持异常层次清晰。
-
按引用捕获异常,避免对象切片和多态丢失。
-
利用 RAII 管理资源,确保异常安全。
-
避免在构造函数中抛出异常,除非能完全清理资源。
-
用
noexcept标记不会抛出异常的函数,提升性能。
总结
C++ 异常处理通过 try/catch/throw 提供了一种结构化的错误管理机制,结合 RAII 和标准异常类,可以有效提升代码的健壮性。合理使用异常处理需权衡性能与安全性,遵循异常安全等级和最佳实践。
相关文章:
全面理解-c++中的异常处理机制
C 的异常处理机制是一种用于处理程序运行时错误的结构化方法,通过分离正常逻辑与错误处理代码,提高代码的可读性和可维护性。以下是其核心组成部分和工作原理的详细说明: 1. 异常处理的三大关键字 1.1 try 块 作用:包裹可能抛出异…...
Deep Dive into LLMs like ChatGPT - by Andrej Karpathy
https://www.youtube.com/watch?v7xTGNNLPyMIhttps://www.youtube.com/watch?v7xTGNNLPyMIDeep Dive into LLMs like ChatGPT - by Andrej Karpathy_哔哩哔哩_bilibilihttps://www.youtube.com/watch?v7xTGNNLPyMI转载自Andrej Karpathy Youtube ChannelThis is a general a…...
react实例与总结(一)
目录 一、简单认识 1.1、特点 1.2、JSX语法规则 1.3、函数组件和类式组件 1.4、类组件三大属性state、props、refs 1.4.1、state 1.4.2、props 1.4.3、refs 1.5、事件处理 1.6、收集表单数据—非受控组件和受控组件 1.7、高阶函数—函数柯里化 1.8、生命周期—新旧…...
51单片机(国信长天)矩阵键盘的基本操作
在CT107D单片机综合训练平台上,首先将J5处的跳帽接到1~2引脚,使按键S4~S19按键组成4X4的矩阵键盘。在扫描按键的过程中,发现有按键触发信号后(不做去抖动),待按键松开后,在数码管的第一位显示相应的数字:从左至右&…...
在cursor/vscode中使用godot C#进行游戏开发
要在 Visual Studio Code(VS Code)中启动 C#Godot 项目,可以按照以下步骤进行配置: 1.安装必要的工具 • 安装 Visual Studio Code:确保你已经安装了最新版本的 VS Code。 • 安装.NET SDK:下载并安装.NET 7.x SDK(…...
机器学习怎么学习,还有算法基本的源代码
1.scikit-learn官方文档,中文版/英文版 中文社区:https://scikit-learn.org.cn/ 中文官方文档:https://scikitlearn.com.cn/ 英文版:https://scikit-learn.org/stable/(翻墙) 2.菜鸟教程:AI&a…...
STM32 RTC亚秒
rtc时钟功能实现:rtc模块在stm32内部,由电池或者主电源供电。如下图,需注意实现时仅需设置一次初始化。 1、stm32cubemx 代码生成界面设置,仅需开启时钟源和激活日历功能。 2、生成的代码,需要对时钟进行初始化,仅需…...
【Linux】深入理解linux权限
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、权限是什么 二、用户和身份角色 三、文件属性 1. 文件属性表示 2. 文件类型 3. 文件的权限属性 四、修改文件的权限属性和角色 1. …...
json格式,curl命令,及轻量化处理工具
一. JSON格式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于一个子集的JavaScript编程语言,使用人类易于阅读的文本格式来存储和表示数据。尽管名字中有“JavaScript”,但JSON是语言无关的,几…...
DeepSeek模拟阿里面试——java面向对象
作为一位阿里高级Java程序员面试官,我会围绕Java面向对象编程的核心概念、实际应用以及设计原则设计问题,以全面评估候选人的理解和应用能力。以下是可能的面试问题: 基本概念与实现方式 请解释Java中封装、继承、多态的基本概念及其在Java中…...
web直播弹幕抓取分析 signature
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言 最近遇到太多难点了卡了很久&am…...
【04】RUST特性
文章目录 隐藏shadowing所有权ownership堆区&栈区所有权规则变量&数据Copy Trait与Drop TraitCopy TraitDrop Trait移动克隆函数参数与返回值的所有权参数引用可变引用悬垂引用slice生命周期隐藏shadowing 有点像同名覆盖 let mut guess = String::new();let guess: u3…...
PL/SQL块结构
目录 一、声明部分(declare) 二、执行部分(begin end) 三、异常处理部分 (Exception end) 四、代码示例 PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库…...
基于 FFmpeg 和 OpenGLES 的 iOS 视频预览和录制技术方案设计
基于 FFmpeg 和 OpenGLES 的 iOS 视频预览和录制技术方案设计 在 iOS 上实现一个基于 FFmpeg 和 OpenGLES 的视频预览和录制功能,需要结合 FFmpeg 的强大音视频处理能力和 OpenGLES 的高效图形渲染能力。以下是一个完整的技术方案设计,包含项目的架构设计、模块划分、技术选…...
【LeetCode 刷题】贪心算法(4)-区间问题
此博客为《代码随想录》贪心算法章节的学习笔记,主要内容为贪心算法区间问题的相关题目解析。 文章目录 55. 跳跃游戏45. 跳跃游戏 II452. 用最少数量的箭引爆气球435. 无重叠区间763. 划分字母区间56. 合并区间 55. 跳跃游戏 题目链接 class Solution:def canJu…...
提示工程 | 目的 | 常用技巧
什么是提示工程 提示工程也叫指令工程,Prompt就是你发给大模型的指令,比如:画幅画,写首诗等。貌似简单,但意义非凡,Prompt是AGI时代的编程语言,Prompt工程是AGI时代的软件工程,提示…...
ABP框架9——自定义拦截器的实现与使用
一、AOP编程 AOP定义:面向切片编程,着重强调功能,将功能从业务逻辑分离出来。AOP使用场景:处理通用的、与业务逻辑无关的功能(如日志记录、性能监控、事务管理等)拦截器:拦截方法调用并添加额外的行为,比如…...
Generate html
"Generate HTML"(生成 HTML)指的是通过程序或工具自动创建 HTML 代码的过程。HTML(超文本标记语言)是用于创建网页内容和结构的标准语言。生成 HTML 通常意味着通过某些方式自动化地构建或生成网页的结构和元素…...
CUDA 计算平台 CUDA 兼容性【笔记】
在 b 站看过的两个关于 CUDA 的技术分享,整理分享下对自己有用的课件。 20231130 2023第9期 聊一聊常见的AI计算平台库_哔哩哔哩_bilibili20230831 2023第6期 聊一聊CUDA兼容性_哔哩哔哩_bilibili 文章目录 CUDA 计算平台CUDA 函数库介绍英伟达三大护城河࿱…...
移动(新)魔百盒刷机教程[M301A_YS]
刚刚成功刷了一个坏的魔百盒,简单记录一下。 刷电视盒子有两种:卡刷和线刷。 线刷 一、线刷准备 1.刷机工具 Amlogic USB Burning Tool 晶晨线刷烧录工具 2.固件 根据盒子的型号、代工等找到对应的固件 二、线刷步骤 电脑打开下好的 Amlogic US…...
最新消息 | 德思特荣获中国创新创业大赛暨广州科技创新创业大赛三等奖!
2024年12月30日,广州市科技局公开第十三届中国创新创业大赛(广东广州赛区)暨2024年广州科技创新创业大赛决赛成绩及拟获奖企业名单,德思特获得了智能与新能源汽车初创组【第六名】【三等奖】的好成绩! 关于德思特&…...
基于机器学习的DDoS检测系统实战
基于机器学习的DDoS检测系统实战(PythonScikit-learn)|毕业设计必备 摘要:本文手把手教你从0到1实现一个轻量级DDoS攻击检测系统,涵盖数据预处理、特征工程、模型训练与可视化分析。 一、项目背景与意义 DDoS&#x…...
ubuntu安装VMware报错/dev/vmmon加载失败
ubuntu安装VMware报错/dev/vmmon加载失败,解决步骤如下: step1:为vmmon和vmnet组件生成密钥对 openssl req -new -x509 -newkey rsa:2048 -keyout VMW.priv -outform DER -out VMW.der -nodes -days 36500 -subj "/CNVMware/"ste…...
使用条件随机场(CRF)进行文本分类并评估模型性能
目标: 使用条件随机场(CRF)模型对文本数据进行分类,并评估模型的性能。任务包括读取数据、划分训练集和测试集、训练CR # 1.数据读取与预处理: # o使用open函数读取包含文本和标签的CSV文件。 # o将每一行数据分为文本…...
python的列表、元组、深拷贝、浅拷贝(四)
python的列表 一、序列1. 序列定义2. 序列数据类型包括3.特点:都支持下面的特性 二、 列表1. 列表的创建2. 列表的基本特性(1) 连接操作符喝重复操作符(2) 成员操作符(in , not in )(3) 索引(4) 切片练习(5) for循环 3. 列表的常用方法(1) 一…...
2.10作业
思维导图 C C语言...
【深度学习】多目标融合算法(四):多门混合专家网络MMOE(Multi-gate Mixture-of-Experts)
目录 一、引言 二、MMoE(Multi-gate Mixture-of-Experts,多门混合专家网络) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、…...
RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决
RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决 1、报错情况 下载:https://gitcode.com/yangzongzhuan/RuoYi-Vue-Oracle 用idea打开,启动: 日志有报错: 点右侧m图标,maven有以下报误 &…...
C# OpenCV机器视觉:对位贴合
在热闹非凡的手机维修街上,阿强开了一家小小的手机贴膜店。每天看着顾客们自己贴膜贴得歪歪扭扭,不是膜的边缘贴不整齐,就是里面充满了气泡,阿强心里就想:“要是我能有个自动贴膜的神器,那该多好啊…...
Baumer工业相机堡盟相机的相机传感器芯片清洁指南
Baumer工业相机堡盟相机的相机传感器芯片清洁指南 Baumer工业相机1.Baumer工业相机传感器芯片清洁工具和清洁剂2.Baumer工业相机传感器芯片清洁步骤2.1、准备步骤2.2、清洁过程1.定位清洁工具2.清洁传感器3.使用吹风装置 Baumer工业相机传感器芯片清洁的优势设计与结…...
