异常处理啊

异常处理

异常

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

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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Next.js初步使用

文章目录 安装和运行页面静态文件 React初步&#xff0c;但不熟悉React也可以学习本文。 安装和运行 Next.js是一个基于React的服务端渲染框架&#xff0c;可以实现构建高性能、可扩展的React应用&#xff0c;提供了很多方便的工具和功能&#xff0c;包括自动代码分割、服务器…

rdf-file:SM2加解密

一&#xff1a;SM2简介 SM2是中国密码学算法标准中的一种非对称加密算法&#xff08;包括公钥和私钥&#xff09;。SM2主要用于数字签名、密钥交换和加密解密等密码学。 生成秘钥&#xff1a;用于生成一对公钥和私钥。公钥&#xff1a;用于加密数据和验证数字签名。私钥&…

【代码】两阶段鲁棒优化/微电网经济调度入门到编程

内容包括 matlab-yalmipcplex微电网两阶段鲁棒经济调度&#xff08;刘&#xff09; matlab-yalmipcplex两阶段鲁棒微电网容量经济优化调度 两阶段鲁棒优化CCG列于约束生成和Benders代码&#xff0c;可扩展改编&#xff0c;复现自原外文论文 【赠送】虚拟储能单元电动汽车建…

【二叉树】常见题目解析(2)

题目1&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 题目1描述&#xff1a; 题目1分析及解决&#xff1a; &#xff08;1&#xff09;base case&#xff1a;当前节点为null时&#xff0c;以当前节点为根节点的树最大深度是0。 &#xff08;2&…

【C/PTA —— 13.指针2(课外实践)】

C/PTA —— 13.指针2&#xff08;课外实践&#xff09; 一.函数题6-1 鸡兔同笼问题6-2 冒泡排序6-3 字符串反正序连接6-4 计算最长的字符串长度6-5 查找星期 二.编程题7-1 C程序设计 实验5-7 数组指针作函数参数7-2 查找奥运五环色的位置 一.函数题 6-1 鸡兔同笼问题 int Chic…

Nginx反向代理详解

Nginx反向代理详解 nginx反向代理是一种常用的服务器架构设计方案&#xff0c;其原理是将客户端请求先发送到反向代理服务器&#xff0c;反向代理服务器再将请求转发到后端真实服务器处理&#xff0c;并将处理结果返回给客户端&#xff0c;从而实现负载均衡、高可用、安全和减…

VSC++: 双进制回文

缘由双进制回文数&#xff0c;一道C程序题&#xff0c;求解&#xff01;&#xff01;&#xff01;&#xff1f;_编程语言-CSDN问答 int 合成100回文(int 数) { int 合 0, 倒 数>10 && 数 < 100 ? 数 / 10 : 数;while (倒)合 * 10, 合 倒 % 10, 倒 / 10, (合…

.net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法

文章目录 .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法详细报错内容解决方案修改数据修改表修改字段 .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法 详细报错内容 System.NotSupportedException…

Elasticsearch分词器--空格分词器(whitespace analyzer)

介绍 文本分析&#xff0c;是将全文本转换为一系列单词的过程&#xff0c;也叫分词。analysis是通过analyzer(分词器)来实现的&#xff0c;可以使用Elasticearch内置的分词器&#xff0c;也可以自己去定制一些分词器。除了在数据写入时将词条进行转换&#xff0c;那么在查询的时…

使用策略模式彻底消除if-else

文章目录 使用策略模式彻底消除if-else1. 场景描述2. if-else方式3. 策略模式 使用策略模式彻底消除if-else 如果一个对象有很多的行为&#xff0c;如果不用恰当的模式&#xff0c;这些行为就只好使用多重的条件选择语句来实现&#xff0c;这样会显得代码逻辑很臃肿&#xff0c…

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

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

LiveGBS流媒体平台GB/T28181功能-概览中负载信息直播、回放、播放、录像、H265、级联查看负载会话列表

LiveGBS常见问题-概览中负载信息具体表示什么直播、回放、播放、录像、H265、级联等 1、负载信息2、负载信息说明3、会话列表查看3.1、会话列表 4、搭建GB28181视频直播平台 1、负载信息 实时展示直播、回放、播放、录像、H265、级联等使用数目 2、负载信息说明 直播&#x…

MATLAB 模型参考自适应控制 - Model Reference Adaptive Control

系列文章目录 文章目录 系列文章目录前言一、参考模型二、扰动与不确定性模型三、直接 MRAC名义模型参数更新间接 MRAC估计器模型和控制器增益参数更新学习修正参考文献 前言 模型参考自适应控制模块计算控制动作&#xff0c;使不确定的受控系统跟踪给定参考被控对象模型的行为…

从0开始学习JavaScript--JavaScript 单元测试

JavaScript单元测试是保障代码质量和可维护性的关键步骤之一。通过编写和运行单元测试&#xff0c;开发者可以确保代码在不断迭代的过程中依然具有正确的行为。本文将深入探讨JavaScript单元测试的核心概念、工具使用和最佳实践&#xff0c;并通过丰富的示例代码演示其实际应用…

PgSQL技术内幕 • statement_timeout做的那些事

PgSQL技术内幕 • statement_timeout做的那些事 statement_timeout是Postgres种的一个配置参数&#xff0c;用于指定SQL语句执行的超时时间&#xff0c;当超时时就取消该SQL的执行&#xff0c;并返回错误信息。这个参数通常用于控制运行时间较长的查询&#xff0c;避免影响数据…

STM32CubeIDE(CUBE-MX hal库)----蓝牙模块HC-05(详细配置)

系列文章目录 STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯 STM32CubeIDE(CUBE-MX hal库)----按键控制 STM32CubeIDE(CUBE-MX hal库)----串口通信 STM32CubeIDE(CUBE-MX hal库)----定时器 文章目录 系列文章目录前言一、蓝牙配置二、CUBE-MX可视化配置三、蓝牙APP调试助手四、…

微信小程序 地图撒点

1. 微信小程序 地图撒点 1.1 说明 首先使用微信小程序自带标签&#xff0c;并且设置好宽高让地图显示&#xff0c;用longitude和latitude表示中心点。   &#xff08;1&#xff09;show-location 显示带有方向的当前定位点,本项目不需要不添加。   &#xff08;2&#xff…

组合(回溯+剪枝、图解)

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 样例输入 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],…

【算法】单调栈题单——字典序最小⭐(一种类型的模板题)

文章目录 题目列表316. 去除重复字母⭐⭐⭐⭐⭐&#xff08;类型题模板&#xff1a;单调栈&#xff0c;字典序最小&#xff09;221021天池-03. 整理书架&#xff08;保留数量为 limit 的字典序最小&#xff09;402. 移掉 K 位数字&#xff08;最多删除 k 次 前导零的处理&…

mysql主从复制-redis集群扩容缩容、缓存优化(缓存更新策略、穿透,击穿,雪崩)、mysql主从搭建、django实现读写分离

基于Docker实现读写分离 1 redis集群扩容缩容 1.1 集群扩容 1.2 集群缩容 2 缓存优化 2.1 缓存更新策略 2.2 穿透&#xff0c;击穿&#xff0c;雪崩 3 mysql主从搭建 4 django实现读写分离 1 redis集群扩容缩容 1.1 集群扩容 # 6台机器&#xff0c;3个节点集群# 8台机器&am…