C++_关于异常处理throw-try-catch

文章目录

  • 作用
    • 1. 无异常捕获
    • 2. 有异常捕获

作用

简单说,异常处理机制主要作用是让程序能够继续执行,或者以一种可控的方式终止,而非让程序因为错误直接崩溃

一个简单的动态数组类,来看看有异常捕获和无异常捕获的区别

1. 无异常捕获

先注释掉 main 函数中的 try-catch
输入数组元素个数 5 ,然后设置下标为 5 的元素值为任意整数,这里假设为111

#include <iostream>
#include <cstddef>    // size_t
#include <stdexcept>  // out_of_range
#include <cstdlib>    // rand exit
using namespace std;class DynamicArray
{
private:int* m_arr;     // 动态分配内存size_t m_size;  // 数组大小
public:DynamicArray(size_t n = 1) :m_size(n)// 默认数组有一个元素{try{m_arr = new int[m_size]();  // 初始化为零    }catch (const bad_alloc& e){cerr << "动态数组内存申请失败: " << e.what() << endl;exit(1);   // 如果内存分配失败,退出程序}}// 内存分配异常捕获放在构造函数里// 如果内存分配失败,程序就没有足够的资源来正常工作// 此时退出程序,给出友好的错误信息~DynamicArray(){delete[] m_arr;  // 释放内存}// 获取数组大小size_t getSize() const{return m_size;  // 获取数组大小}// 设置指定位置的元素值void set(size_t index, int value){if (index >= m_size){throw out_of_range("越界");}m_arr[index] = value;}// 输出数组所有元素void print(){int i;for (i = 0; i < m_size; i++){cout << m_arr[i] << "\t";}cout << "\n\n";}
};int main() 
{srand(unsigned(time(NULL)));while (1){cout << "请输入数组元素个数:";int n;cin >> n;DynamicArray  array(n);   // 动态数组对象int i;int x;//try  //对于可恢复的错误,抛出异常并让外部调用者来处理//{cout << "输入x 设置下标为x的元素值为111" << endl;cin >> x;array.set(x, 111);//}//catch (const out_of_range& e)//{//    cerr << "ERROR: " << e.what() << endl;//    continue;//}}   return 0;
}

在这里插入图片描述
程序直接运行中崩溃,中止

2. 有异常捕获

将 main 函数中的 try-catch 注释行恢复
输入数组元素个数 5 ,然后设置下标为 5 的元素值为任意整数,这里假设为111
当发生异常时(比如数组越界),程序不退出, continue 跳过当前循环并提示用户重新输入

#include <iostream>
#include <cstddef>    // size_t
#include <stdexcept>  // out_of_range
#include <cstdlib>    // rand exit
using namespace std;class DynamicArray
{
private:int* m_arr;     // 动态分配内存size_t m_size;  // 数组大小
public:DynamicArray(size_t n = 1) :m_size(n)// 默认数组有一个元素{try{m_arr = new int[m_size]();  // 初始化为零    }catch (const bad_alloc& e){cerr << "动态数组内存申请失败: " << e.what() << endl;exit(1);   // 如果内存分配失败,退出程序}}// 内存分配异常捕获放在构造函数里// 如果内存分配失败,程序就没有足够的资源来正常工作// 此时退出程序,给出友好的错误信息~DynamicArray(){delete[] m_arr;  // 释放内存}// 获取数组大小size_t getSize() const{return m_size;  // 获取数组大小}// 设置指定位置的元素值void set(size_t index, int value){if (index >= m_size){throw out_of_range("越界");   // 抛出越界异常}m_arr[index] = value;}// 输出数组所有元素void print(){int i;for (i = 0; i < m_size; i++){cout << m_arr[i] << "\t";}cout << "\n\n";}
};int main() 
{srand(unsigned(time(NULL)));while (1){cout << "请输入数组元素个数:";int n;cin >> n;DynamicArray  array(n);   // 动态数组对象int i;int x;try  //对于可恢复的错误,应该抛出异常并让外部调用者来处理{cout << "输入x 设置下标为x的元素值为111" << endl;cin >> x;array.set(x, 111);}catch (const out_of_range& e){cerr << "ERROR: " << e.what() << endl;cout << "\n\n";continue;}array.print();}   return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 Python 实现多线程编程?

在Python中实现多线程编程&#xff0c;主要通过threading模块来完成。 这个模块提供了丰富的API用于创建和管理线程。多线程可以提高程序的响应性&#xff0c;并且对于I/O密集型任务&#xff08;如网络请求、文件读写等&#xff09;来说&#xff0c;可以显著减少等待时间。 由…

Java的封装、继承、多态

书接上文&#xff0c;我们聊完了Java的类和对象&#xff0c;有没有唤起你脑海的一些记忆呢&#xff0c;我们有了类和对象的基础之后&#xff0c;我们就可以衍生出来封装继承和多态。 封装 我理解一个东西&#xff0c;我一般会先想这个是什么&#xff0c;再是怎么用&#xff0…

【C#】新建窗体文件,Form、UserControl

从用途、功能性和架构方面进行描述。 1. 继承自 Form 的窗体&#xff08;通常是窗口&#xff09;&#xff1a; 在 C# 中&#xff0c;Form 是用于创建应用程序的主窗口或对话框窗口的类。当您继承自 Form 时&#xff0c;您创建的是一个完整的窗口&#xff0c;可以显示内容、与…

OSCP:我理解的Web环境知识

你需要特别关注以下模块所涵盖的知识点&#xff0c;因为它们在考试中出现的概率很高。 1、SQL 注入&#xff08;SQL Injection&#xff09; ●允许攻击者注入自定义的、潜在恶意的 SQL 代码&#xff0c;由底层数据库执行。 ●可能导致数据泄露或目标服务器上的远程代码执行&…

Java 转Scala的那些异同

引言 在这个数据爆炸的时代&#xff0c;大数据应用如雨后春笋般涌现。作为一名 Java 开发者&#xff0c;你可能会发现 Scala 这个新世界充满了诱惑。Scala 结合了面向对象和函数式编程的优点&#xff0c;尤其在大数据领域&#xff08;如 Apache Spark&#xff09;中表现得尤为…

Fiddler 5.21.0 使用指南:过滤浏览器HTTP(S)流量下(四)

概述 在上一篇文章中&#xff0c;我们介绍了一部分简单的过滤功能&#xff0c;已经可以帮助我们较为准确的定位到感兴趣的请求&#xff1b;提升我们的工作效率&#xff0c;我们可以通过设置更为复杂的过滤规则&#xff0c;精准到定位的我们想要的请求和响应信息。专注于分析对…

LabVIEW氢同位素单质气体定量分装系统

氢同位素单质气体在多个行业中有重要应用&#xff0c;如能源和化工。传统的分装方法面临精度和自动化程度不足的问题。为此&#xff0c;开发了一套基于LabVIEW和质量流量控制器的定量分装系统&#xff0c;提高分装精度和效率&#xff0c;同时减少资源浪费和环境污染。 项目背景…

包管理器npm,cnpm,yarn和pnpm

npm (Node Package Manager) 核心技术与工作原理 依赖解析&#xff1a; 广度优先搜索&#xff08;BFS&#xff09;&#xff1a;npm 使用 BFS 算法来解析依赖树&#xff0c;尽量扁平化 node_modules 目录以减少重复的依赖项。冲突处理&#xff1a;如果两个包需要同一个依赖的不…

各个系统查询电脑 CPU 核心数

Windows 方法 1: 使用任务管理器 右键点击任务栏&#xff0c;选择 任务管理器。在任务管理器中&#xff0c;点击 性能 标签。选择 CPU&#xff0c;在右侧会显示核心数&#xff08;“内核”&#xff09;和逻辑处理器数。 方法 2: 使用命令提示符 打开 命令提示符&#xff08;Win…

最新AI问答创作运营系统(SparkAi系统),GPT-4.0/GPT-4o多模态模型+联网搜索提问+问答分析+AI绘画+管理后台系统

目录 一、人工智能 系统介绍文档 二、功能模块介绍 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI大模型 多模态模型文档分析 多模态识图理解能力 联网搜索回复总结 3.2 AI智能体应用 3.2.1 AI智能体/GPTs商店 3.2.2 AI智能体/GPTs工作台 3.2.3 自…

KNN_识别图片数字

1.实验过程省略灰度化处理过程&#xff0c;用已经处理好的txt数据进行训练 3.jpg from PIL import Image def imgtotxt(imgfile,txtfile,size (32,32)):image_file Image.open(imgfile).resize(size,Image.LANCZOS).convert(L)width,height image_file.sizef open(txtfile,…

外卖开发(六)—— 高查询量数据的缓存

外卖开发&#xff08;六&#xff09;—— 高查询量数据的缓存 一、代码实现缓存1、查询缓存2、修改数据时删除缓存 二、spring cache注解实现1、Cacaheable2、CacheEvict 一、代码实现缓存 1、查询缓存 在查询的时候&#xff0c;先去redis中查找数据&#xff0c;如果存在则直…

VAS1260Q奇力LED驱动芯片DCDC降压恒流

VAS1260Q是一款专为车规级LED照明设计的连续模式电感降压驱动器&#xff0c;能够高效地驱动单个或多个串联LED。它集成了高端输出电流检测电路&#xff0c;并通过外部电阻设置标称平均输出电流&#xff0c;具有高可靠性和宽广的应用场景。 核心技术参数 1. 输入…

移动端使用REM插件postcss之postcss-px2rem

目录 一、概念 二、核心特性 三、功能 四、插件模块 注意事项&#xff1a; 五、使用 安装&#xff1a; 配置 一、概念 工具类型&#xff1a;PostCSS是一个基于JavaScript的工具&#xff0c;用于转换CSS的工作流。核心理念&#xff1a;PostCSS的核心理念是“转换而非替…

渗透测试:网络安全的深度探索

一、引言 在当今数字化时代&#xff0c;网络安全问题日益凸显。企业和组织面临着来自各种恶意攻击者的威胁&#xff0c;他们试图窃取敏感信息、破坏系统或进行其他恶意活动。渗透测试作为一种主动的安全评估方法&#xff0c;能够帮助企业发现潜在的安全漏洞&#xff0c;提高网…

JS听到了强运的回响

正则表达式 介绍 正则表达式是用于匹配字符串中字符组合的模式&#xff0c;在JS中&#xff0c;正则表达式也是对象 通常用来查找&#xff0c;替换那些符合正则表达式的文本 就是筛选出符合条件的一类人 比如说 有人喜欢玩艾斯爱慕&#xff0c;那他喜欢的就是这一类人&…

文件的操作

什么是文件 如何是数据持久化——保存在硬盘上(文件&#xff0c;数据库)磁盘上的文件是文件在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件程序文件&#xff0c;比如源文件&#xff08;.c文件&#xff09;读a文件写到b文件里&#xff0c;此时a…

【18. 自定义类型:结构体类型】

文章目录 一、结构体类型的声明1.1 结构体回顾1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的⾃引⽤ 2. 结构体变量的创建和初始化2.1 对⻬规则2.2 为什么存在内存对⻬?2.3 修改默认对⻬数 3. 结构成员访问操作符3. 结构体传参 4. 结构体内存对…

疯狂原始人

With every sun comes a new day. 每每旭日东升 A new beginning. 都是崭新的开始 A hope that things will be better today than they were yesterday. 总是期冀今日之美远胜昨日 But not for me. My names Eep. 但不属于我 我叫小伊 And this is my family. The Crood…

【D3.js in Action 3 精译_043】5.1 饼图和环形图的创建(三):圆弧的绘制

当前内容所在位置&#xff1a; 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段&#xff08;一&#xff09;5.1.2 饼图布局生成器&#xff08;二&#xff09;5.1.3 圆弧的绘制&#xff08;三&#xff09; ✔️5.1.4 数据标签的添加&#xff08;四&…