异常处理啊

异常处理

异常

程序运行过程中,发生错误导致异常退出(不是程序的语法问题,而是代码的逻辑问题,编译不出错)。

e.g.  string 字符串,使用 at 函数访问其中的字符元素时,如果越界,程序会抛出:out_of_range

只要抛出异常,且不对异常进行处理,后面代码都将不会执行。

#include <iostream>
using namespace std;int main()
{string str = "Hey!";cout << str.at(6) << endl;cout << "Hello~" << endl;return 0;
}

在这里插入图片描述

异常提供了一种转移权限控制权的方式。
程序一旦出现异常没有经过处理,就会造成程序运行的崩溃。
C++ 中提供了异常处理的机制。需要两种配合使用:抛出异常(throw)和 捕获异常(try-catch)

throw

thorw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出异常的类型。
抛出到函数调用的上一级。

// 无效的 throw:#include <iostream>
using namespace std;int divide(int a, int b)
{int c = a/b;				// 可疑代码if (b == 0)					// 抛出异常throw int(0);return c;
}int main()
{cout << divide(3, 0) << endl;cout << "Hello~" << endl;return 0;
}

一定要先抛出异常,再执行可疑代码。
Throw 只能抛出异常,不能对异常进行处理(不会让异常发生,但是代码仍然不能继续执行)。

throw 数据类型(值);

// 有效的 throw:#include <iostream>
using namespace std;int divide(int a, int b)
{if (b == 0)throw int(0);			// 抛出到函数调用的上一级return a/b;
}int main()
{cout << divide(3, 0) << endl;cout << "Hello~" << endl;return 0;
}

在这里插入图片描述

try - catch

用于对 throw 抛出异常的捕获和处理。
try 中存放所有可能发生异常的语句,但 try 中只能捕获一次异常,当获取到一次异常后,后续的代码都不会执行。因此,建议在 try 中只存放一条语句。

catch 对异常进行处理:

验证异常对象 —> 补救措施
1、按异常的类型处理,catch(类型) —> 根据不同的类型,输出不同处理
2、对异常值进行处理,catch(类型 值) —> 根据不同的值,输出不同处理

#include <iostream>
using namespace std;void search(int *arr, int size, int index)
{if (index < 0){throw string("Negative index");}if (index == size){throw int(size);}if (index > size){throw int(index);}cout << "array[" << index << "] = " << *(arr + index) << endl;
}int main()
{int array[3] = {1, 2, 3};try {search(array, 3, 2);search(array, 3, -1);} catch (string) {cout << "Error: Negative index" << endl;} catch (int num) {if (num == 3)cout << "Error: Index equals to size" << endl;if (num > 3)cout << "Error: Index greater than size" << endl;}try {search(array, 3, 3);} catch (string) {cout << "Error: Negative index" << endl;} catch (int num) {if (num == 3)cout << "Error: Index equals to size" << endl;if (num > 3)cout << "Error: Index greater than size" << endl;}try {search(array, 3, 5);} catch (string) {cout << "Error: Negative index" << endl;} catch (int num) {if (num == 3)cout << "Error: Index equals to size" << endl;if (num > 3)cout << "Error: Index greater than size" << endl;}cout << "Hello~" << endl;return 0;
}

在这里插入图片描述

#include <iostream>
using namespace std;double division(double a, double b)
{if (b == 0){string text("除数等于0!");throw text; 			// 抛出一个异常:std::string}return a/b;
}double input()
{cout << "input 开始执行 " << endl;double a;double b;cout << "请输入两个浮点型:"<< endl;cin >> a >> b;double c = 0;try{c = division(a, b);}catch(string &e){// 验证异常对象cout << e << endl;// 补救措施return 0;}cout << "input 执行结束" << endl;return c;
}int main()
{cout << "main函数开始执行" <<endl;cout << input() << endl;    		cout << "程序执行结束" <<endl;return 0;
}

捕获异常可能会出现以下几种情况:
1、 无异常抛出,此时程序正常运行,不进入 catch 块。
2、 异常抛出,正确捕获,此时程序进入 catch 块。
3、 异常抛出,错误捕获(捕获类型不对),此时程序仍然会向上抛出寻求正确捕获,如果每一层都没有正确捕获,程序仍然停止运行。

注意:

1、抛出异常一定要在发生异常之前;
2、抛出异常时,一定要给出数据类型和值;
3、try - catch 对异常处理时分为两种情况:
a. 同类型的异常只有一个,在 catch 中可以直接对异常类型进行判断;
b. 如果相同类型的异常有多个,需要对异常值进行判断。

标准异常体系

C++ 将常见的的异常类型进行了定义和分类,引入:#include<stdexcept> 头文件后可使用。
但是这个体系还是太薄弱,可以对其进行拓展。
catch 块可以匹配基类异常类型,提高匹配的成功率,但是会降低匹配的精度。
在这里插入图片描述

捕获标准类型的异常:

#include <iostream>
#include <stdexcept>		// 头文件
using namespace std;int main()
{string s = "Hello, world";cout << s[12] << endl;			// 打印空行的'\0',这就是建议使用 at()函数 的原因try 		// 尝试抛出一个异常{cout << s.at(100) << endl;}catch(out_of_range &e){// 输出错误信息cout << e.what() << endl;// 弥补措施cout << "-1" << endl;}return 0;
}

在这里插入图片描述

抛出自定义的异常:

#include <iostream>
#include <stdexcept>			// 头文件
using namespace std;// 继承exception
class MyException:public exception
{
public:// 覆盖 what 函数// throw:异常规格说明// 表示此函数不会出现异常的抛出const char * what() const throw(){return "Customized";}
};void show(string a, string b)
{if (a == "#" || b == "#"){throw MyException();cout << a << b << endl;			// 此句永远不会被执行}
}int main()
{cout << "Please input two strings: " << endl;string a;string b;cin >> a >> b;try{show(a, b);}catch(MyException &e){cout << e.what() <<endl;}cout << "End. " << endl;return 0;
}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

2022年高校大数据挑战赛B题图像信息隐藏求解全过程论文及程序

2022年高校大数据挑战赛 B题 图像信息隐藏 原题再现&#xff1a; 互联网的快速发展&#xff0c;给图像、视频的传播方式带来巨大变化。图像作为媒体的重要载体&#xff0c;每天有大量的原创图像公开在互联网上&#xff0c;如何保护图像版权的同时不破坏原始的图像一直是图像处…

代码随想录刷题题Day3

刷题的第三天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C / Python Day3 任务 ● 链表理论基础 ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表 1 链表理论基础 链表&#xff1a;通过…

卷积神经网络(VGG-16)猫狗识别

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 再次检查数据3. 配置数据集4. 可视化数据 三、构建VG-16网络四、编译五、训练模型六、模型评估七、保存and加载模型八、预测…

笔记----单纯剖分----1

笔记----单纯剖分 定义 线性组合仿射组合&#xff1a; 线性组合的系数为1凸组合&#xff1a; 仿射组合所有的系数都是正数 凸集 R^m 的 任意有限个点的凸组合仍在其中的子集仿射子空间 R^m 的 任意有限个点的仿射组合仍在其中的子集凸包 conv(A) A是R^m的一个子集 A的所有有限凸…

Rust语言项目实战(二) - 准备键盘和终端屏幕

上一章节中&#xff0c;我们实现了游戏开始音频的播放&#xff0c;本章我们开始编写游戏界面。我们的游戏是在命令行终端中运行的&#xff0c;因此编写的界面也是终端中展示的界面&#xff0c;上一章中&#xff0c;我们已经把相关的依赖包crossterm添加到了依赖列表中。本章首先…

Valentina Studio Pro:引领数据库管理软件新潮流

你是否正在寻找一款强大且易用的数据库管理软件&#xff1f;Valentina Studio Pro可能就是你的不二之选。这款软件是由Valentina Team开发的一款综合性数据库管理和编辑工具&#xff0c;它支持多种数据库系统&#xff0c;包括MySQL、PostgreSQL、SQLite等。 Valentina Studio …

java调用mysql存储过程

一、背景 在mysql上定义了存储过程&#xff0c;然后我想每1分钟调用一次存储过程。于是我设置了一个event&#xff0c;但是这个事件默认的运行周期为天&#xff0c;我尝试修改成minute却不生效。所以我决定通过java代码来调用存储过程。 二、mysql存储过程 CREATE DEFINERroot…

cpu版本的torch可以用清华镜像源安装

一、来到pytroch官网找到如下代码 官方提供的默认的安装cpu版本的torch的命令 pip3 install torch torchvision torchaudio二、使用清华镜像安装 pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple

自然语言处理 (NLP) 中的组合语义分析

埃弗顿戈梅德&#xff08;Everton Gomede&#xff09; 一、介绍 自然语言处理 &#xff08;NLP&#xff09; 中的组合语义分析是一个引人入胜且复杂的话题。为了充分理解它&#xff0c;将这个概念分解成它的基本组成部分是至关重要的&#xff1a;组合语义及其在NLP中的应用。组…

零售数字化“逆熵”的6项原则和8种能力建设|ShopeX徐礼昭

作者&#xff1a;徐礼昭 来源&#xff1a;《三体零售逆熵法则》节选 旧的规则与秩序被打破&#xff0c;无序成为常态 新时代洪流裹挟冲击着传统零售 无序带来的“熵增”侵蚀企业生命 所有人都在不确定性中寻找确定 数字化如何助力企业铸就「反熵增」神器&#xff1f; 如何…

uniapp设置手机通知权限以及uniapp-push2.0推送

unipush2.0代码 export default function () {// 调用获取用户通知权限setPermissions()// 获取客户端唯一的推送标识&#xff0c;可用于测试uni.getPushClientId({success: (res) > {console.log(res.cid)},fail(err) {console.log(err)}})// 监听推送uni.onPushMessage(r…

设计模式之美学习笔记-单例模式-为什么说支持懒加载的双重检测不比饿汉式更优?

单例设计模式&#xff1a;一个类只允许创建一个对象&#xff08;或者实例&#xff09;&#xff0c;那这个类就是一个单例类&#xff0c;这种设计模式就叫作单例设计模式&#xff0c;简称单例模式。 实战案例一&#xff1a;处理资源访问冲突 我们先来看第一个例子。在这个例子…

第十节HarmonyOS 常用基础组件-Image

一、组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声名式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;基础组件…

xss漏洞后端进行html消毒

import org.jsoup.Jsoup;public static String sanitizeHtml(String input) {// 使用 Jsoup 消毒 HTMLreturn Jsoup.clean(input, Safelist.relaxed());}public static void main(String[] args) {String userInput "<p><script>alert(1)</script>Safe…

海外IP罗拉rola正版去哪里找?

免费海外IP代理能用吗&#xff1f;和收费的有哪些差异&#xff1f; 如今在这个大数据时代&#xff0c;无论你从事哪个行业&#xff0c;都离不开数据&#xff0c;尤其是做跨境电商的&#xff0c;更一步都离不开海外IP代理&#xff0c;无论是网站引擎优化还是营销推广、数据抓取…

LeetCode105.从前序和中序遍历序列构造二叉树

这道题看完题想了几分钟就想到大概的思路了&#xff0c;但是在写的时候有很多细节没注意出了很多问题&#xff0c;然后写了1个多小时&#xff0c;其实这道题挺简单的。 首先&#xff0c;最基本的知识&#xff0c;先序遍历是根左右&#xff0c;中序遍历是左根右&#xff0c;那么…

集简云语聚AI新增模型测试,支持多模型同时进行交互,快速评估不同模型性能

语聚AI模型测试 在ChatGPT爆火的推动下&#xff0c;由生成式 AI 掀起的全球人工智能新浪潮就此拉开了序幕&#xff0c;人工智能也成为越来越多企业提升业务效率、优化业务流程的首选方案。 然而&#xff0c;面对层出不穷的AI模型&#xff0c;每个模型在完善度、功能性、易用性…

uni-app 微信小程序 电子签名及签名图片翻转显示功能

文章目录 1. 需求背景2. 开始撸2.1 点击 重写 进入签名页面&#xff08;上图一&#xff09;2.2 书写签名&#xff0c;点击确认返回&#xff0c;及图片翻转显示&#xff08;上图二&#xff0c;三&#xff09; 3. 图片进行翻转&#xff0c;返回翻转后的图片 1. 需求背景 接的一个…

Hdoop学习笔记(HDP)-Part.6 安装OracleJDK

六、安装OracleJDK 下载jdk安装文件&#xff0c;放到/opt中&#xff0c;将文件解压到/usr/local下后&#xff0c;修改/etc/profile文件中环境参数&#xff0c;实现java的安装。 创建jdk.yml文件 ---- hosts: alltasks:- name: copy and unzip jdkunarchive:src: "/opt/j…

C++学习之路(十五)C++ 用Qt5实现一个工具箱(增加16进制颜色码转换和屏幕颜色提取功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《Base64图片编码预览功能》功能。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加两个平时经常用到的功能吧&#xff0c;就是「 16进制颜色码转RGB文本 」和 「屏幕颜色提取」功能。下面我们就来看看如何来规划…