c++中异常处理

一、C++ 中的异常处理机制

  • 基本原理:C++ 异常处理机制提供了一种在程序运行期间处理错误和异常情况的结构化方式。它基于 trycatch 和 throw 三个关键字来实现。当程序中出现异常情况时,可以使用 throw 表达式抛出一个异常对象,然后在可能捕获该异常的 try 块之后的 catch 块中进行处理。
  • try 块try 块中包含可能会抛出异常的代码。当 try 块中的代码执行时,如果发生了异常,程序的执行流程会立即跳转到相应的 catch 块中进行处理,try 块中剩余的代码将不会被执行。
  • catch 块catch 块用于捕获和处理由 try 块中抛出的异常。一个 try 块可以跟多个 catch 块,每个 catch 块可以捕获特定类型的异常。当异常被抛出时,程序会按照 catch 块出现的顺序依次检查每个 catch 块,找到与抛出的异常类型匹配的第一个 catch 块,并执行其中的代码来处理异常。
  • 异常对象throw 表达式抛出的异常可以是任何类型的对象,通常建议使用自定义的异常类来表示不同类型的异常情况。异常对象可以携带有关异常的详细信息,例如错误代码、错误消息等,以便在 catch 块中进行更准确的处理。

格式: 

try
{// 保护代码
}
catch( ExceptionName1 e1 )//第一种异常
{// catch 块
}
catch( ExceptionName2 e2 )//第二种异常
{// catch 块
}
catch( ExceptionName3 eN )//第三种异常
{// catch 块
}

我们把会抛出异常的代码放到try代码块里面,再用catch关键字捕获异常。如下:

#include <iostream>
using namespace std;
double division(double a, double b)
{try{if (b == 0){throw "出现了除数为0的错误";//throw关键字抛出错误类型 const char*}}catch (const char* error_string)//捕获const char*类型的错误{cout << error_string << endl;//打印它}return (a / b);
}
int main()
{cout << division(1, 0);
}

二、应该使用异常处理的情况

  • 函数可能无法完成其预定任务时:例如一个函数用于打开一个文件并读取其中的数据,但如果文件不存在或者无法打开,就可以抛出一个异常来通知调用者该操作失败,而不是返回一个特殊的错误码。
  • 资源分配失败时:当使用 new 运算符动态分配内存失败时,会抛出 bad_alloc 异常。同样,在使用其他资源(如网络连接、数据库连接等)时,如果资源分配或初始化失败,也可以通过异常来处理。
  • 库函数或第三方代码中的错误:当调用库函数或第三方代码时,如果它们内部发生了错误并通过异常来通知调用者,那么在调用这些函数的代码中就需要使用异常处理来捕获和处理这些异常,以保证程序的稳定性。
  • 逻辑错误或违反前置条件时:如果函数的参数不符合预期的前置条件,或者程序执行到某个逻辑上不应该出现的情况时,可以抛出异常来表示程序的状态异常。

三、异常处理的优点

  • 分离错误处理代码和正常业务逻辑:使得代码的结构更加清晰,正常的业务逻辑可以专注于实现功能,而错误处理逻辑则集中在 catch 块中,提高了代码的可读性和可维护性。
  • 增强程序的健壮性:能够及时捕获和处理运行时出现的各种异常情况,避免程序因未处理的异常而崩溃,使程序更加稳定可靠。
  • 提供了一种统一的错误处理机制:无论异常在程序的哪个层次或哪个函数中抛出,都可以通过异常处理机制将其传递到合适的地方进行处理,使得整个程序的错误处理更加一致和规范。
  • 便于错误信息的传递和处理:异常对象可以携带详细的错误信息,使得在 catch 块中可以根据具体的异常类型和错误信息进行更有针对性的处理,例如向用户显示友好的错误提示,或者记录详细的错误日志等。

四、异常处理的缺点

  • 性能开销:异常处理机制在一定程度上会影响程序的性能。当抛出异常时,程序需要进行一些额外的操作来查找匹配的 catch 块,这可能会导致一定的时间开销。在一些对性能要求极高的场景中,可能需要谨慎使用异常处理。
  • 增加代码复杂性:如果过度使用异常处理或者异常处理不当,可能会导致代码变得复杂难以理解。例如,过多的 try 和 catch 块嵌套会使代码的执行流程难以跟踪,增加了代码的维护难度。
  • 异常安全问题:在使用异常处理时,需要特别注意资源的释放和对象的状态管理,以确保程序在发生异常后仍然处于一个合理的状态。如果处理不当,可能会导致资源泄漏、对象状态不一致等问题。

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

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

相关文章

三菱FX5UPLC以太网Socket通信功能Passive开放的程序示例

Passive开放的通信流程如下所示。 参数设置 示例程序中使用的参数设置如下所示。 [CPU模块】 导航窗口↔[参数]↔[模块型号]↔[模块参数]-[以太网端口]-[基本设置]-[对象设备连接配置设置]↔[详细设置]→[以太网配置(内置以太网端口)]画面 【以太网模块】 [导航]中「参数]→[模…

【MATLAB源码-第292期】基于matlab的4ASK调制解调窄带通信系统仿真,输出各节点波形图以及误码率曲线图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 窄带通信系统是指带宽较小、频谱利用效率较低的通信系统。与宽带通信系统相比&#xff0c;窄带系统的特点是信号的带宽相对较窄&#xff0c;因此需要更精确的调制技术来实现有效的通信。在窄带通信中&#xff0c;常见的调制方…

【搜索结构】AVL树的学习与实现

目录 什么是AVL树 AVL树的定义 插入函数的实现 左单旋和右单旋 左右双旋与右左双旋 什么是AVL树 AVL树实际上就是二叉搜索树的一种变体&#xff0c;我们都知道二i叉搜索树可以将查找的时间复杂度提升到O(logn)&#xff0c;极大提升搜索效率。但是在极端情况下&#xff0c;当…

【专题】2024年中国消费者消费意愿调查报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38242 当今时代&#xff0c;经济社会多元发展&#xff0c;消费市场复杂多变。消费者的行为、需求和支出意愿不断演变&#xff0c;深刻影响着各个领域的发展。家庭余钱的用途反映出消费者在储蓄、教育、医疗等方面的考量。在消费领域…

推荐一款游戏玩家性能优化工具:Razer Cortex

Razer Cortex是一款专为游戏玩家设计的性能优化工具&#xff0c;它旨在提升玩家的游戏体验。通过该软件&#xff0c;用户可以优化 PC 性能&#xff0c;从而提高游戏的流畅度&#xff0c;减少延迟并增强视觉效果&#xff0c;尤其在需要精准操作的游戏中&#xff0c;流畅的画面和…

人工智能(AI)对于电商行业的变革和意义

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/402a907e12694df5a34f8f266385f3d2.png#pic_center> &#x1f393;作者简介&#xff1a;全栈领域优质创作者 &#x1f310;个人主页&#xff1a;百锦再新空间代码工作室 &#x1f4de;工作室&#xff1a;新空间代…

1435:【例题3】曲线 一本通 代替三分

1435&#xff1a;【例题3】曲线 题目来源&#xff1a;一本通oj链接 代替三分 题意 给出t组数据&#xff0c;每组里面有n个函数&#xff0c;求出t组数据的函数的最小值 思路 函数是二次函数&#xff0c;具有单峰性&#xff0c;利用左右两边单调性的原理可以进行答案三分处…

英伟达Isaac Manipulator产品体验

相关配置 Isaac Manipulator3.1.0Isaac Sim4.2.0Ubuntu20.04GPURTX 4090 LaptopCPUI9 13900HXMem64GB 过程记录与反馈 GPU加速效果 请描述您在使用Isaac Manipulator时&#xff0c;调用cuMotion加速库来进行机器人运动规划和轨迹优化等任务的步骤和过程&#xff0c;并记录任…

“非法”操控lambda(python)

能过python解释器关卡即是合法脚本代码&#xff0c;偶尔的“违规”操控也是一种唯美。 (笔记模板由python脚本于2024年11月13日 11:18:21创建&#xff0c;本篇笔记适合熟悉python的lambda操控的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.pyth…

[ 网络安全介绍 5 ] 为什么要学习网络安全?

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

java八股笔记-1-java基础

java 特点&#xff1a; 1.平台无关性&#xff0c;java 的字节码文件可以在任何安装了 JVM 的系统上运行 2.面相对象&#xff0c;几乎一切都可以抽象为对象&#xff0c;包括类&#xff0c;对象&#xff0c;继承&#xff0c;封装&#xff0c;多态&#xff0c;抽象 抽象&#xf…

Java入门16——接口

我们今天来学习接口&#xff0c;和继承有点像&#xff0c;话不多说&#xff0c;开始正题~ 一、接口 1.为什么要用接口 接口其实和继承很像&#xff0c;但是继承是 is-a 的关系&#xff0c;接口是 has-a 的关系&#xff0c;而且继承只能是一对一的关系&#xff0c;但是接口可以…

Sigrity SPEED2000 Power Ground Noise Simulation模式如何进行串扰分析操作指导-trace耦合

Sigrity SPEED2000 Power Ground Noise Simulation模式如何进行串扰分析操作指导-trace 耦合 Sigrity Power SI Power Ground Noise Simulation模式可以用来分析信号间的串扰,以下图为例 2D视图

地下水数值模拟软件Visual modflow Flex实践技术应用

专题一 地下水数值软件的操作流程、建模步骤和所需资料处理及相关注意事项 [1] Visual MODFLOW Flex特征 [2] Visual MODFLOW Flex软件界面及模块 [3] 地下水数值模拟的建模步骤及数据需求 专题二 模型建模操作方法 技巧、真实案例演练、特殊问题处理[1] 直接模型建模的操作方法…

保险、银行等金融行业都在做的“双录”是什么?电子签约如何实现

“双录”也就是同步录音、录像&#xff0c;是指在特定的业务场景中通过录音和录像的方式来记录相关业务过程中的关键环节和重要内容&#xff0c;帮助确定业务办理人真实身份和意愿、实现业务过程可回溯管理。 起初&#xff0c;双录主要用于保险销售&#xff0c;后来逐步扩展到…

总结拓展十五:特殊采购业务——寄售采购

1、寄售采购的定义 寄售采购是指供应商提供物料&#xff0c;并将它们存储在你处&#xff0c;在贵公司将这些物料从寄售库存提取&#xff08;转自有&#xff09;之前&#xff0c;该供应商一直是这些物料法律上的所有者。只有当这些物料被贵司转自有领用后&#xff0c;供应商才会…

python 同时控制多部手机

在这个智能时代,我们的手机早已成为生活和工作中不可或缺的工具。无论是管理多个社交媒体账号,还是处理多台设备上的事务,如何更高效地控制多个手机成为了每个人的痛点。 今天带来的这个的软件为你提供了一键控制多部手机的强大功能。无论是办公、娱乐,还是社交,你都能通过…

c++:string(一)

文章目录 一string类1C语言中的字符串2C中的string二遍历1[ ]2迭代器3const迭代器4范围for5auto6总结三String的尾插1size和length2max_size,capacity和clear3访问接口4尾插字符和字符串5 append的重载三string的扩容问题&#xff08;1&#xff09;怎么扩容&#xff08;2&#…

如何从数字化迈向智能化的跨越,重塑企业合同管理的未来

随着信息技术的快速发展&#xff0c;越来越多的企业开始认识到合同管理的重要性&#xff0c;并纷纷实施数字化战略以提高管理效率和降低运营成本。然而&#xff0c;仅仅实现合同管理的数字化还远远不够&#xff0c;真正的转型应该是向智能化迈进。本文将通过一个实际案例来探讨…

书生浦语XTuner 微调个人小助手

文章目录 一、环境配置与数据准备1.构建一个xtuner环境2.安装 XTuner3.修改提供的数据四、训练启动1.模型位置2.创建软连接即可3.修改官方的Config4.启动微调4.权重转换4. 模型合并二、进阶任务2.1 上传到 HuggingFace 一、环境配置与数据准备 XTuner 文档链接&#xff1a;XTu…