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.rhkb.cn/news/486639.html

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

相关文章

云原生基础设施指南:精通 Kubernetes 核心与高级用法

1. 云原生的诞生 随着互联网规模的不断增长&#xff0c;以及企业对敏捷开发、快速交付和高可用性的需求日益增强&#xff0c;传统的单体架构逐渐暴露出局限性&#xff0c;难以满足现代业务对动态扩展和高效迭代的要求。为此&#xff0c;云原生应运而生。 云原生是为云计算时代…

如何用python获取图像

方法一&#xff1a;利用PIL中的Image函数&#xff0c;这个函数读取出来不是array格式 这时候需要用 np.asarray(im) 或者 np.array()函数&#xff1b;区别&#xff1a;np.array() 是深拷贝&#xff0c;np.asarray() 是浅拷贝。 from PIL import Image import numpy as npI Im…

[机器学习] 监督学习之线性回归与逻辑回归

这里写目录标题 一、监督学习概述二、线性回归&#xff08;一&#xff09;模型表示&#xff08;二&#xff09;损失函数&#xff08;三&#xff09;梯度下降算法导入所需库生成模拟数据&#xff08;可替换为真实数据&#xff09;初始化参数并进行训练可视化损失函数随迭代次数的…

JavaScript柯里化和组合函数以及严格模式介绍

柯里化介绍 柯里化的结构 简化版本 让函数的职责单一 柯里化的复用 对某些逻辑进行复用 打印日志的柯里化 自动化柯里化函数 实现柯理化函数 1.柯里化函数是对函数进行处理的方法&#xff0c;所以参数就为一个函数&#xff0c;这里取名w为fn 2.定义一个函数curried&#xff0…

笔记04--零基础创建个人本地大模型知识库ollama+Dify

ollma安装 官网下载直接下一步下一步即可&#xff0c;没有魔法的朋友可以留言&#xff0c;文章中所用到的文件也给打包了&#xff0c;大家可以直接下载使用通过云盘下载使用。 链接: https://pan.baidu.com/s/12zF9MpQtg1bnMDAQayaSyg 提取码: n9rm 官网地址&#xff1a;http…

ACM:连数问题

任务内容 Description 设有n个正整数&#xff0c;将他们连接成一排&#xff0c;组成一个最大的多位整数。例如:n3 时&#xff0c;3个整数13,312,343,连成的最大整数为:34331213 又如:n4 时,4 个整数 7,13,4,246 连接成的最大整数为7424613 Input N N 个数 Output 连接成的多位数…

Element-ui el-tree 异步加载 懒加载 只能选择一个同级节点

需求 树的数据是通过异步(懒)加载而来&#xff0c;且要求同级节点只能选择一个&#xff0c;一个常见的应用场景是选择住址&#xff0c;选择了山东省不能同时选择河北省&#xff0c;选择了每个节点&#xff0c;显示完整的从根节点到本节点的路径 。 分析 Element-ui的el-tre…

【Linux文件管理】重定向内核级缓冲区用户级缓冲区

文章目录 文件管理文件描述符表&#xff08;files_struct&#xff09;重定向重定向概念 文件的内核级缓冲区和用户级缓冲区内核级缓冲区用户级缓冲区 总结 文件管理 文件描述符表&#xff08;files_struct&#xff09; 上一期我们将文件描述符讲完了&#xff0c;这期来讲讲文…

【H2O2|全栈】Node.js与MySQL连接

目录 前言 开篇语 准备工作 初始配置 创建连接池 操作数据库 封装方法 结束语 前言 开篇语 本节讲解如何使用Node.js实现与MySQL数据库的连接&#xff0c;并将该过程进行函数封装。 与基础部分的语法相比&#xff0c;ES6的语法进行了一些更加严谨的约束和优化&#…

OpenCV 图像基本操作

OpenCV快速通关 第一章&#xff1a;OpenCV 简介与环境搭建 第二章&#xff1a;OpenCV 图像基本操作 OpenCV 图像基本操作 OpenCV快速通关第二章&#xff1a;OpenCV 图像基本操作一、相关结构体与函数介绍&#xff08;一&#xff09;cv::Mat 结构体&#xff08;二&#xff09;c…

故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab)

故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别&#xff08;Matlab&#xff09; 目录 故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别&#xff08;Matlab&#xff09;分类效果基本描述程序设计参考资料 分类效果 基本描述 格拉姆角场差&#xff08;GADF&#…

树莓派4B android 系统添加led灯 Hal 层

本文内容需要用到我上一篇文章做的驱动&#xff0c;可以先看文章https://blog.csdn.net/ange_li/article/details/136759249 一、Hal 层的实现 1.Hal 层的实现一般放在 vendor 目录下&#xff0c;我们在 vendor 目录下创建如下的目录 aosp/vendor/arpi/hardware/interfaces/…

基于Matlab的变压器仿真模型建模方法(9):三相变压器组的建模仿真(续)

1.引言 前一节介绍了基于混合磁链的考虑主磁路饱和情况的三相变压器组的Simulink仿真模型,并应用它对Y,yn接法三相变压器组的瞬态过程进行了仿真计算。这一节建立一个新的基于等效电路的Simulink三相变压器组的仿真模型,并应用它对Y,d11接法的三相变压器组的瞬态过程进行仿…

【Atcoder】【ABC383】A- Humidifier 1加湿器 题解

前言 不知道大家有没有关注过AtCoder 这是小日子那边的一个网站&#xff0c;每周都会有比赛 比起CF等等&#xff0c;最大的优点就是延迟低&#xff0c;题目质量也不错 计划以后每周更新题解了 正文 题目传送门A - Humidifier 1 题目大意 有一个加湿器&#xff0c;给定 …

LeetCode 热题 100_反转链表(23_206_简单_C++)(单链表_递归)

LeetCode 热题 100_反转链表&#xff08;23_206&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;迭代&#xff09;&#xff1a;思路二&#xff08;简化方法一(迭代)代码&#xff09;&#xff1a;思路三&…

49 基于单片机的湿度和光照监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于AT89C52单片机&#xff0c;采用DHT11温湿度传感器检测土壤湿度&#xff0c;光敏电阻连接ADC0832数模转换器作为光敏传感器&#xff0c;然后通过LCD1602显示湿度和光照值&#xff0c;如果湿度低…

【C语言】程序设计--算法

文章目录 1. 判断两个数的大小并交换2. 计算三角形面积3. 根据x的值计算y4. 字符大小写转换5. 百钱百鸡问题6. 计算公式y的值7. 输出所有的水仙花数8. 计算n的阶乘9. 下三角数据10. 斐波那契数列11. 学生成绩统计12. 数组的平均值1. 判断两个数的大小并交换 介绍: 从键盘输入…

嵌入式Linux,字符串的处理,以及相关函数详解

C 语言库函数中已经给我们提供了丰富的字符串处理相关函数&#xff0c;基本常见的字符串处理需求都可 以直接使用这些库函数来实现。 1. 字符串输入/输出 在程序当中&#xff0c;经常需要在程序运行过程中打印出一些信息&#xff0c;譬如调试信息、报错信息、中间产生的变量的…

400G智算网络助力知名自动驾驶企业算力训练提效

根据Gartner的最新趋势预测&#xff0c;自动驾驶技术正迅速发展&#xff0c;预计在未来几年内将带来显著的商业效益&#xff0c;特别是在决策智能和边缘人工智能领域。目前&#xff0c;一家领军企业正积极拥抱基于大模型的数字化转型之路&#xff0c;作为自动驾驶领域的佼佼者&…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)

目录 ARC规则 概要 所有权修饰符 __strong修饰符 __weak修饰符 __unsafe_unretained修饰符 ___autoreleasing修饰符 ARC规则 概要 “引用计数式内存管理”的本质部分在ARC中并没有改变&#xff0c;ARC只是自动地帮助我们处理“引用计数”的相关部分。 在编译单位上可以…