C++ throw(抛出异常)详解

 C++ 异常处理的流程,具体为:

抛出(Throw)--> 检测(Try) --> 捕获(Catch)

异常必须显式地抛出,才能被检测和捕获到;如果没有显式的抛出,即使有异常也检测不到。

在 C++ 中,我们使用 throw 关键字来显式地抛出异常,它的用法为:

throw exceptionData;

exceptionData 是“异常数据”的意思,它可以包含任意的信息,完全有程序员决定。exceptionData 可以是 int、float、bool 等基本类型,也可以是指针、数组、字符串、结构体、类等聚合类型,请看下面的例子:

char str[] = "http://c.biancheng.net";
char *pstr = str;
class Base{};
Base obj;
throw 100;  //int 类型
throw str;  //数组类型
throw pstr;  //指针类型
throw obj;  //对象类型

一个动态数组的例子

C/C++ 规定,数组一旦定义后,它的长度就不能改变了;换句话说,数组容量不能动态地增大或者减小。这样的数组称为静态数组(Static array)。静态数组有时候会给编码代码不便,我们可以通过自定义的 Array 类来实现动态数组(Dynamic array)。所谓动态数组,是指数组容量能够在使用的过程中随时增大或减小。

下面这段代码虽然有点长,但它是一个典型的使用异常的场景,请大家耐心阅读。

#include <iostream>
#include <cstdlib>
using namespace std;//自定义的异常类型
class OutOfRange{
public:OutOfRange(): m_flag(1){ };OutOfRange(int len, int index): m_len(len), m_index(index), m_flag(2){ }
public:void what() const;  //获取具体的错误信息
private:int m_flag;  //不同的flag表示不同的错误int m_len;  //当前数组的长度int m_index;  //当前使用的数组下标
};void OutOfRange::what() const {if(m_flag == 1){cout<<"Error: empty array, no elements to pop."<<endl;}else if(m_flag == 2){cout<<"Error: out of range( array length "<<m_len<<", access index "<<m_index<<" )"<<endl;}else{cout<<"Unknown exception."<<endl;}
}//实现动态数组
class Array{
public:Array();~Array(){ free(m_p); };
public:int operator[](int i) const;  //获取数组元素int push(int ele);  //在末尾插入数组元素int pop();  //在末尾删除数组元素int length() const{ return m_len; };  //获取数组长度
private:int m_len;  //数组长度int m_capacity;  //当前的内存能容纳多少个元素int *m_p;  //内存指针
private:static const int m_stepSize = 50;  //每次扩容的步长
};Array::Array(){m_p = (int*)malloc( sizeof(int) * m_stepSize );m_capacity = m_stepSize;m_len = 0;
}
int Array::operator[](int index) const {if( index<0 || index>=m_len ){  //判断是否越界throw OutOfRange(m_len, index);  //抛出异常(创建一个匿名对象)}return *(m_p + index);
}
int Array::push(int ele){if(m_len >= m_capacity){  //如果容量不足就扩容m_capacity += m_stepSize;m_p = (int*)realloc( m_p, sizeof(int) * m_capacity );  //扩容}*(m_p + m_len) = ele;m_len++;return m_len-1;
}
int Array::pop(){if(m_len == 0){throw OutOfRange();  //抛出异常(创建一个匿名对象)}m_len--;return *(m_p + m_len);
}//打印数组元素
void printArray(Array &arr){int len = arr.length();//判断数组是否为空if(len == 0){cout<<"Empty array! No elements to print."<<endl;return;}for(int i=0; i<len; i++){if(i == len-1){cout<<arr[i]<<endl;}else{cout<<arr[i]<<", ";}}
}int main(){Array nums;//向数组中添加十个元素for(int i=0; i<10; i++){nums.push(i);}printArray(nums);//尝试访问第20个元素try{cout<<nums[20]<<endl;}catch(OutOfRange &e){e.what();}//尝试弹出20个元素try{for(int i=0; i<20; i++){nums.pop();}}catch(OutOfRange &e){e.what();}printArray(nums);return 0;
}

运行结果:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Error: out of range( array length 10, access index 20 )
Error: empty array, no elements to pop.
Empty array! No elements to print.

Array 类实现了动态数组,它的主要思路是:在创建对象时预先分配出一定长度的内存(通过 malloc() 分配),内存不够用时就再扩展内存(通过 realloc() 重新分配)。Array 数组只能在尾部一个一个地插入(通过 push() 插入)或删除(通过 pop() 删除)元素。

我们通过重载过的[ ]运算符来访问数组元素,如果下标过小或过大,就会抛出异常(第53行代码);在抛出异常的同时,我们还记录了当前数组的长度和要访问的下标。

在使用 pop() 删除数组元素时,如果当前数组为空,也会抛出错误。

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

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

相关文章

深入理解强化学习——马尔可夫决策过程:策略迭代-[贝尔曼最优方程]

分类目录&#xff1a;《深入理解强化学习》总目录 当我们一直采取 arg ⁡ max ⁡ \arg\max argmax操作的时候&#xff0c;我们会得到一个单调的递增。通过采取这种贪心 arg ⁡ max ⁡ \arg\max argmax操作&#xff0c;我们就会得到更好的或者不变的策略&#xff0c;而不会使价值…

TrustGeo论文问题理解

1、网络空间测绘中&#xff0c;如何理解地标&#xff1f; 在网络空间测绘中&#xff0c;地标可以理解为在互联网空间中具有明显特征和稳定性的实体&#xff0c;它们可以作为网络空间的基准点&#xff0c;用于定位和标识其他网络实体。地标通常是在网络空间中具有较高价值和影响…

7-2 新奇偶分家

给定 N 个正整数&#xff0c;请按奇数和偶数将它们分开。 输入格式: 第一行给出一个正整数 N&#xff08;2≤N≤20&#xff09;。 第二行给出 N 个正整数&#xff0c;以空格分隔&#xff0c;保证其中既有奇数又有偶数。 输出格式: 按输入的先后顺序分别给出这 N 个正整数中…

2024世界燕窝滋补品展|上海燕博会推荐品牌天健燕窝集团-为消费者带来好燕窝!

天健燕窝集团拥有27年燕窝进出口贸易经验。是最早加入经营正规燕窝业务的企业之一&#xff0c;业务范围遍布全中国&#xff0c;2015 年至2019 年连续5年燕窝进口量全国第一。 一年一届的世界燕窝及天然滋补品博览会暨世界滋补生态发展大会&#xff08;简称上海燕博会&#xff…

ffmpeg相关命令

视频转码 dav转化为mp4格式 ffmpeg -i 2021-08-10.dav -codec copy 11.mp4二进制文件转为mp4格式 // -c:v 指定视频流编码器&#xff0c;不指定编码会默认用mp4这种容器的默认音视频编码进入编码 // copy&#xff1a;不重新编码直接copy源视频流ffmpeg -i 1701687125-4fc72a…

网格中的最小路径代价

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 问题描述 给你一个下标从 0 开始的整数矩阵 grid &#xff0c;矩阵大小为 m x n &#xff0c;由从 0 …

VUE3语法--toRefs与toRef用法

1、功能概述 ref和reactive能够定义响应式的数据&#xff0c;当我们通过reactive定义了一个对象或者数组数据的时候&#xff0c;如果我们只希望这个对象或者数组中指定的数据响应&#xff0c;其他的不响应。这个时候我们就可以使用toRefs和toRef实现局部数据的响应。 toRefs是…

CentOS7 安装包 MariaDB 10.4.x

CentOS7 安装包 MariaDB 10.4.x 统一 MariaDB安装包 https://www.alipan.com/s/fvLg3gN7LPX 提取码: nh81 打开「阿里云盘」

React中父子之间数据的通信方式

上篇父子之间通信讲的是父子之间方法的通信&#xff0c;今天讲的是父子之间数据共享&#xff0c;因为是自己遇到什么就来总结什么了&#xff0c;所以没有一下更新完。 Father.tsx import React, { useEffect, useState, useRef } from react; import Child from ./component/c…

关于Anaconda的安装和环境部署(此章专为新手制定)

目录 Anaconda简介 一、软件下载&#xff08;地址&#x1f447;&#xff09; 2&#xff1a;点击下载 3&#xff1a;版本选择&#xff1a; 4&#xff1a;Anaconda的安装包就下载完成了 2&#xff1a;恭喜你&#xff0c;看到这里已经完成安装了 三、部署环境 1&#xff1…

【开题报告】基于SpringBoot的小饭桌管理系统的设计与实现

1.选题背景 &#xff08;1&#xff09;技术需求&#xff1a;随着互联网和移动互联网的快速发展&#xff0c;餐饮行业也面临着数字化、信息化的挑战和机遇。许多餐厅或饭店管理仍然采用传统的方式&#xff0c;存在着排队等候时间长、座位安排不合理等问题。因此&#xff0c;设计…

什么是 AWS IAM?如何使用 IAM 数据库身份验证连接到 Amazon RDS(上)

驾驭云服务的安全环境可能很复杂&#xff0c;但 AWS IAM 为安全访问管理提供了强大的框架。在本文中&#xff0c;我们将探讨什么是 AWS Identity and Access Management (IAM) 以及它如何增强安全性。我们还将提供有关使用 IAM 连接到 Amazon Relational Database Service (RDS…

ubuntu 20.04 server 安装 zabbix

ubuntu 20.04 server 安装 zabbix 参考文档 https://www.yuque.com/fenghuo-tbnd9/ffmkvs?# zabbix没用过&#xff0c;用过prometheus&#xff0c; 因为现在很多应用都支持直接接入prometheus监控&#xff0c; 而且大部分语言都都有sdk支持&#xff0c; 可以直接接入自己的…

Python卡尔曼滤波器OpenCV跟踪和预测物体的轨迹

模拟简单物体二维运动和预测位置 预测数学式 想象一下你正坐在一辆汽车里&#xff0c;在雾中行驶。 你几乎看不到路&#xff0c;但你有一个 GPS 系统可以告诉你你的速度和位置。 问题是&#xff0c;这个 GPS 并不完美&#xff1b; 它有时会产生噪音或不准确的读数。 您如何知…

lightdb 23.4 支持pivot行转列

前言 Lightdb-x支持行转列、列转行功能&#xff1a; pivot支持的语法如下&#xff1a; pivot支持项测试 pivot测试 create table hs_pivot(name varchar(40),course varchar(100),score int); insert into hs_pivot values(‘zhangsan’,‘chinese’,90); insert into h…

香港高才通计划申请被拒了?很可能是因为这五个原因!

香港高才通计划申请被拒了&#xff1f;很可能是因为这五个原因&#xff01; 据统计&#xff0c;截止今年10月31日&#xff0c;香港各项输入人才计划共收到超过18万宗申请&#xff0c;超过11万宗已被批准&#xff0c;已有7万人到港。其中&#xff0c;高才通计划一共收到约55,000…

Java基础语法之访问修饰限定符

private 表示私有的&#xff0c;只能在同一个包中的同一个类使用 像这样就是在同一个包中的不同类用了private修饰的变量&#xff0c;这是非法的&#xff0c;那到底该如何给a赋值呢&#xff1f;可以在定义时就赋值&#xff0c;但这样的代码就没有可操作性&#xff0c;所以我们…

2023年12月12日作业

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTimer> #include <QTime> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : pub…

深入浅出接口测试原理及步骤

那么接口是什么&#xff1f; 软件开发&#xff0c;既要做前端&#xff0c;也要做后端&#xff0c;并且后端是整个业务的核心&#xff0c;用于处理业务请求&#xff0c;实现具体的功能&#xff1b;而前端只是提供一个页面给用户看结果以及提供页面给用户做输入。所以整个业务的…

章鱼网络进展月报 | 2023.11.1-11.30

章鱼网络大事摘要 1、2023年12月&#xff0c;Octopus 2.0 将会正式启动。 2、隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态。 3、Louis 受邀作为嘉宾&#xff0c;在 NEARCON2023 的多链网络主题沙龙中发言&#xff1a;我们依然处于区…