异常处理啊

异常处理

异常

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

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;如何保护图像版权的同时不破坏原始的图像一直是图像处…

Android 12.0 Launcher3定制化之folder文件夹去掉背景功能实现

1.概述 在12.0的系统产品开发rom定制中,在Launcher3的开发中,在Launcher3的folder文件夹中, 在进入文件夹由于背景是白色的,不是很美观,所以要求去掉白色背景,要求背景换成透明的 所以需要从folder文件夹流程中,找到相关的背景设置的地方,去掉相关背景的功能就可以了 …

代码随想录刷题题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的所有有限凸…

sklearn教程:titanic泰坦尼克号数据集

文章目录 数据集介绍导入数据集info()显示数据类型和是否缺失describe()数据描述性统计数据可视化-探索性分析EDA填充缺失值之后的可视化类别变量的相关关系数据集介绍 这个数据集是基于泰坦尼克号中乘客逃生的,泰坦尼克号出事故,船上的乘客的一些信息被记录在这张表中。现在…

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

深入探究Alibaba Druid:Java界的数据库连接池巨人

深入探究Alibaba Druid&#xff1a;Java界的数据库连接池巨人 引言 在现代企业级应用开发中&#xff0c;数据库连接池是不可或缺的组件之一。它们负责降低数据库操作的延迟&#xff0c;提高性能&#xff0c;并且能有效管理数据库连接资源。在众多数据库连接池中&#xff0c;A…

1292:宠物小精灵之收服

【算法分析】 该问题为二维费用背包。精灵球数量、皮卡丘体力值都是费用。 题目说&#xff0c;如果一个野生小精灵让皮卡丘的体力小于等于0&#xff0c;那么无法收服该小精灵。也就是说当皮卡丘有m点体力时&#xff0c;最多可以消耗的体力为m-1点。在输入m后&#xff0c;先让…

自然语言处理 (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;基础组件…

VB.NET二维数组的组合

缘由https://bbs.csdn.net/topics/397512167 首先写了自上而下的查找&#xff0c;在此基础上再加逻辑控制以达到目标。 Sub 四维组合()Dim wei4 {{4, 5, 6, 7}, {1, 2, 4, 8}, {9, 10, 11, 12}, {3, 13, 21, 22}}Dim j 1, h 0, f 0, zc wei4(0, f)Dim sc ""Whi…

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;无论是网站引擎优化还是营销推广、数据抓取…