C++中的异常处理机制是怎么样的?

C++ 中的异常处理机制是一种用于处理运行时错误的强大工具。它允许程序在遇到错误或异常情况时,能够有序地转移控制到适当的异常处理代码,并从错误中恢复。C++ 的异常处理使用了三个主要的关键字:trycatch 和 throw

throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。

try: try 块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个 catch 块。

catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常,可以用多个catch进行捕获

基本语法

throw:当程序遇到无法处理的情况或错误时,可以使用 throw 抛出一个异常。这告诉程序的其他部分发生了一些意外情况,通常需要特别处理。

  • 在函数的 后面接throw(类型),列出这个函数可能抛掷的所有异常类型。
  • 函数的后面接throw(),表示函数不抛异常。
  • 若无异常接口声明,则此函数可以抛掷任何类型的异常
// 这里表示这个函数会抛出A/B/C/D中的某种类型的异常
void fun() throw(A,B,C,D);// 这里表示这个函数只会抛出bad_alloc的异常
void* operator new (std::size_t size) throw (std::bad_alloc);// 这里表示这个函数不会抛出异常
void* operator delete (std::size_t size, void* ptr) throw();// C++11 中新增的noexcept,表示不会抛异常
thread() noexcept;
thread (thread&& x) noexcept;

try:用于定义一个代码块,希望在其中捕获异常。任何可能抛出异常的代码应该放在 try 块中。

try {  // 可能会抛出异常的代码  
}

catch:与 try 配对的,用于捕获和处理特定类型的异常。当 try 块内抛出异常时,控制转移到 catch 块。

catch (const ExceptionType &e) {  // 处理异常的代码  
}

汇总

异常发生第一现场,抛出异常
void  function( ){//... ...throw 表达式;//... ...
}
在需要关注异常的地方,捕捉异常
try{//程序function();        把function至于try中//程序
}catch(异常类型声明){        比如只写一个int//... 异常处理代码 ...
}catch(异常类型 形参){       形参将会取得抛出的值//... 异常处理代码 ...
}catch(...){               抛出的其它异常类型,可以接收任意类型//
}
如果没有catch(...),并且没有catch子句与抛出的异常类型匹配,程序会直接中断报错。

try和trow的不同

功能和目的

  • try

    • try 块用于定义一个代码块,该代码块包含在执行过程中可能抛出异常的代码。
    • 它的目的是捕获和处理异常,以便在发生错误时使程序能够继续运行而不崩溃。
  • throw

    • throw 用于实际抛出异常。它的作用是表示在程序中发生了错误,并将控制权转移到相关的异常处理程序(即 catch 块)。
    • 它的目的是传递异常状态以及与该异常相关的信息。

 控制流

  • try

    • 当程序遇到 try 块中的代码时,它会继续执行该块中的代码,直到抛出异常或代码顺利结束。
    • 如果在 try 块内抛出异常,控制权立即转移到对应的 catch 块,而不会继续执行 try 块中抛出异常后面的代码。
  • throw

    • 当 throw 被执行时,当前代码的执行将立即停止,并且程序的控制流转移到最近的匹配的 catch 块。
    • throw 会引发堆栈展开,执行必要的析构函数,以安全地清理资源。

 异常的产生与处理

  • try

    • try 块内的代码是执行的地方,所有潜在的异常都会在这里被监视。
  • throw

    • 使用 throw 语句放置在代码中一旦发现错误或不期望的情况,即可以生成(抛出)一个异常。

 

try 是用于捕获异常的代码块,定义了可能出现异常的代码范围。

throw 是用于抛出异常的语句,表示在该位置发生了错误。

异常抛出和捕获原则

1.异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个catch的处理代码。

2. 被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个。

3. 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象, 所

以会生成一个拷贝对象,这个拷贝的临时对象会在被 catch 以后销毁。(这里的处理类似 于函数

的传值返回),续C++11之后按右值处理,调用移动构造。

double Division(int x, int y)
{// 当y == 0时抛出异常if (y == 0)throw "Division by zero condition!";elsereturn ((double)x / (double)y);
}......
try 
{Division(1, 0);
}
// 类型不匹配不会激活	catch,往下执行
catch (const int* p)
{cout << p << endl;
}catch (const char* str)
{cout << str << endl;
}

异常处理的工作原理

  1. 异常抛出:throw关键字则用于在程序中显式地抛出异常,通知上层调用者当前代码遇到了无法继续执行的情况,当 throw 语句被执行时,程序的控制从当前的执行点转移到匹配的 catch 块。

  2. 堆栈展开:在控制转移的过程中,C++ 会执行堆栈展开,即析构当前作用域内的所有对象,以释放资源。这使得在异常情况下,尽量避免资源泄漏。

  3. 异常匹配:C++ 查找与抛出的异常类型匹配的 catch 块,找到后执行该块中的代码。如果没有找到匹配的 catch 块,程序将终止并可能产生未捕获异常的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14112.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

「数据要素」行业简报|2024.11.上刊

纵观数据要素行业动态&#xff0c;洞察行业风向&#xff0c;把握行业脉搏&#xff01; 一、政策发布 1、《山东省公共数据资源登记管理工作规范(试行)》公开征求意见 11月7日&#xff0c;为认真贯彻落实《中共中央办公厅 国务院办公厅关于加快公共数据资源开发利用的意见》《…

NFS Write IO 不对齐深度分析

背景 最近团队小伙伴弗曼统计了线上用户数据写入对齐情况&#xff0c;通过统计数据发现了一个有趣的现象: 用户写入请求中近 70% 的数据块 4K 不对齐&#xff0c;这也就是说 NFSClient 对大多数的应用写入没有做对齐优化。 下面会从 NFSClient BufferWrite 实现流程的维度解释…

微型导轨在自动化生产线中起什么作用?

在现代制造业的飞速跃进中&#xff0c;自动化生产线的蓬勃发展引领了一场效率与质量的双重革命。微型导轨作为传动领域的重要零部件&#xff0c;可用于工业自动化生产线上的零件运输、加工设备定位等&#xff0c;实现自动化生产和减少人力成本。那么&#xff0c;微型导轨在自动…

【ESP32】DIY一个电子测光仪

这里写目录标题 0 前言1 开箱2 过程2.1 下载固件2.2 烧录固件2.3 编程环境 Thonny2.4 点灯大师2.5 TFT屏幕2.6 BH1750传感器 成果展示 0 前言 开发板&#xff1a;ESP32-S3-5691 开发环境&#xff1a;circuitpythonthony 1 开箱 2 过程 2.1 下载固件 使用circuitpython的方式开…

MSA+抑郁症模型总结

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&#x1f3a5; 希望在…

解决Jenkins使用 Git 参数插件拉取 commit 列表缓慢问题

Jenkins使用 Git 参数插件拉取 commit 列表缓慢问题 项目问题问题描述解决方案具体实现 项目问题 在 Jenkins 中使用 Git 参数插件 进行参数化构建&#xff0c;具有多方面的重要性和好处。这不仅提高了构建的灵活性和透明度&#xff0c;还能大大提升开发和运维效率。以下是使用…

黑马智数Day7

获取行车管理计费规则列表 封装接口 export function getRuleListAPI(params) {return request({url: parking/rule/list,params}) } 获取并渲染数据 import { getRuleListAPI } from /apis/carmounted() {this.getRuleList() }methods: {// 获取规则列表async getRuleList(…

员工电脑怎么监控?这些电脑监控软件必备

在当今远程办公、灵活工时盛行的时代&#xff0c;如何掌握员工的在线活动、确保工作效率和数据安全成为许多企业关注的焦点。电脑监控软件作为管理工具中的关键一环&#xff0c;可以有效帮助企业了解员工的在线行为&#xff0c;避免效率低下和数据泄露等风险。今天我们就来介绍…

学习干货|实战学习应急响应之Windows日志分析,网络安全零基础入门到精通教程!

前言 本次环境将从大赛内与实战环境相结合去了解在应急响应中Windows日志分析的几个关键点&#xff0c;符合大赛及真实环境案例&#xff0c;本次环境将从WEB层面的日志分析到主机内的几种关键日志分析和重点功能进行排查 题目描述&#xff1a;某台Windows服务器遭到攻击者入侵…

零基础光伏人,数据计算轻松拿捏

在可再生能源领域&#xff0c;光伏产业以其清洁、可再生的特点日益受到全球关注。然而&#xff0c;对于初学者或“零基础光伏人”而言&#xff0c;光伏项目涉及的一系列数据计算和专业知识往往显得复杂而难以入手。幸运的是&#xff0c;随着技术的进步&#xff0c;一系列光伏计…

一文搞懂链表相关算法

目录 链表的逆序和截断 逆序 截断 查找链表的中间节点 力扣题 博主主页&#xff1a;东洛的克莱斯韦克-CSDN博客 链表的逆序和截断 逆序 推荐使用头插法逆序&#xff0c;首先要 new 一个虚拟头节点——newNode。如下图 链表的头节点为head&#xff0c;由cur指针指向head&a…

红外热成像技术开启光伏检测新视界

随着全球对可再生能源需求的不断增加&#xff0c;光伏发电系统的应用日益广泛。然而&#xff0c;光伏组件在长期运行中可能会出现各种故障&#xff0c;如热斑效应、隐裂、接线盒故障等&#xff0c;这些问题不仅影响光伏系统的发电效率&#xff0c;还可能引发安全隐患。 红外热成…

基于vue框架的的社区智慧养老系统1mo30(程序+源码+数据库+调试部署+开发环境)

系统程序文件列表 项目功能&#xff1a;老人,员工,老人档案,养生视频,社区医生,就医信息,在线咨询,咨询回复,菜品信息,点餐订单,服务预约,通知信息,服务评价,健康关爱,新闻公告,监控日志 开题报告内容 以下是一份基于Vue框架的社区智慧养老系统的开题报告&#xff0c;详细阐述…

龙蜥8.6 配置用户登录次数和锁定策略(已亲测)

操作系统&#xff1a;龙蜥8.6 x86_64 查看是否安装pam模块 rpm -qa | grep pam 查看可以使用的认证模块&#xff0c;因为有的系统是pam_tally2. cd /etc/pam.d ls 经过查看&#xff0c;该服务器是使用的pam_faillock 模块 打开/etc/pam.d/password-auth 的 PAM 配置文件…

【6.4】位运算-判断是否存在重复元素

一、题目 给定一个整数数组&#xff0c;判断 是否存在重复元素 。如果存在一值在数组中 出现至少两次 &#xff0c;函数返回 true 。如果数组中每个元素都不相同&#xff0c;则返回 false 。 示例 1: 输入: [ 1 , 2 , 3 , 1 ] 输出: true 示例 2: 输入: [ 1 , 2 , 3 , 4 ] 输出…

PCB打样下单流程

PCB打样下单流程 一、PCB打样在线下单流程1&#xff0e;平台登录2&#xff0e;PCB打样领券3&#xff0e;进入下单系统4&#xff0e;上传PCB文件5&#xff0e;PCB订单界面 PCB&#xff08;印刷电路板&#xff09;打样是验证设计、优化性能和推进项目进度的关键环节。随着互联网的…

Python爬虫知识体系-----正则表达式-----持续更新

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、正则基础1. 为什么使用正则2. 正则与re模块简介 二、正则表达式1. 匹配单个字符与数字2. 限定符3. 定位符4. 选择匹…

yolo标签自动标注(使用python和yolo方法)

yolo代码自动标注 1.引言1.初阶“自动标注”&#xff0c;给每个图像都生成一个固定的标注文件&#xff0c;进而在labglimg中对矩形框进行微调&#xff0c;减少标注的工作量2.高阶自动标注&#xff0c;利用我们训练好的&#xff08;但是没有特别精准的&#xff09;yolo文件先对每…

在 WPF 中,如何使用命令来替代事件处理?

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;命令是一种非常强大的替代传统事件处理的方法&#xff0c;特别适用于 MVVM&#xff08;Model-View-ViewModel&#xff09;架构。命令可以实现界面&#xff08;View&#xff09;和逻辑&#xff08;…

语音 AI 革命:未来,消费者更可能倾向于与 AI 沟通,而非人工客服

「未来&#xff0c;消费者更可能倾向于与 AI 沟通&#xff0c;而非人工客服&#xff0c;因为这将成为解决问题的最高效途径。」 这篇来自 Bessemer Venture Partners 的报告&#xff0c;是目前为止对语音 AI 在企业应用上最完整清晰的一次梳理。 核心要点&#xff1a; 尽管市…