异常处理啊

news2024/11/17 12:56:16

异常处理

异常

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

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.coloradmin.cn/o/1276679.html

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

相关文章

SQL Server数据库部署

数据库简介 使用数据库的必要性 使用数据库可以高效且条理分明地存储数据&#xff0c;使人们能够更加迅速、方便地管理数据。数据库 具有以下特点。 》可以结构化存储大量的数据信息&#xff0c;方便用户进行有效的检索和访问。 》 可以有效地保持数据信息的一致性&#xff0c…

(详细教程)笔记本电脑安装Ubuntu系统

1.前言 老的小米笔记本淘汰了&#xff0c;装一下linux系统玩一下。 使用工具如下&#xff1a;一台小米笔记本pro15.6一个惠普32G U盘一个台式机用于下载镜像等资源 2.下载Ubuntu桌面版 cn.ubuntu.com/download/de… 这里我下载的是 22.04.3 LTS 3.下载烧录工具&#xff0c…

软件设计中如何画各类图之三时序图:理解对象交互顺序的利器

目录 1 前言2 符号及说明2.1 对象&#xff08;Object&#xff09;2.2 生命线&#xff08;Lifeline&#xff09;2.3 消息&#xff08;Message&#xff09;2.4 激活&#xff08;Activation&#xff09; 3 画时序图的步骤3.1 确定参与对象3.2 绘制生命线3.3 添加消息3.4 标识激活3…

公共部门生成式人工智能的未来

作者&#xff1a;Dave Erickson 最近&#xff0c;我与 IDC Government Insights 研究副总裁阿德莱德奥布莱恩 (Adelaide O’Brien) 坐下来讨论了全球公共部门生成式人工智能的当前和未来状况。 完整的对话可以按需查看&#xff0c;但我也想强调讨论中的一些要点。 我们的目标是…

【Python表白系列】一起去看流星雨吧!(完整代码)

文章目录 流星雨环境需求完整代码详细分析系列文章流星雨 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want5…

在IDEA中,如何修改Jetty的端口号,操作超简单

在IDEA中的jetty配置中的VM options中填入&#xff1a;-Djetty.portxxxx 如下图&#xff1a;

VSC++: 双进制回文

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

HT71778 实时音频信号跟踪同步升压转换器的特性

HT71778是一款高功率、全集成升压转换器&#xff0c;集成16mΩ功率开关管和18mΩ同步整流管&#xff0c;为便携式系统提供G效的小尺寸处理方案。 HT71778 实时音频信号跟踪同步升压转换器的特性&#xff1a; ・实时音频信号跟踪的电源供电 SN 短接地, VIN 2.7~4.5V, VOUT 5…

时间复杂度为 O(n^2) 的排序算法 | 京东物流技术团队

对于小规模数据&#xff0c;我们可以选用时间复杂度为 O(n2) 的排序算法。因为时间复杂度并不代表实际代码的执行时间&#xff0c;它省去了低阶、系数和常数&#xff0c;仅代表的增长趋势&#xff0c;所以在小规模数据情况下&#xff0c; O(n2) 的排序算法可能会比 O(nlogn) 的…

数字化智慧工地管理云平台源码(人工智能、物联网)

​智慧工地优势&#xff1a;"智慧工地”将施工企业现场视频管理、建筑起重机械安全监控、现场从业人员管理、物料管理、进度管理、扬尘噪声监测等现场设备有机、高效、科学、规范的结合起来真正实现工程项目业务流与现场各类监控源数据流的有效结合与深度配合&#xff0c;…

【Node.js】笔记梳理 8 - API和JWT

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

Hdoop学习笔记(HDP)-Part.15 安装HIVE

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Linux 系统是如何收发网络包的?(计算机网络)

一、Linux 网络协议栈 如下是TCP/IP四层网络模型&#xff0c;实际上Linux 网络协议栈与它相似 下图是Linux 网络协议栈 二、Linux 接收网络包的流程 1.网卡是计算机里的一个硬件&#xff0c;专门负责接收和发送网络包&#xff0c;当网卡接收到一个网络包后&#xff0c;会通过…

Leetcode 剑指 Offer II 055. 二叉搜索树迭代器

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 实现一个二叉搜索树迭代器类 BSTIterator &#xff0c;表示一个按…

华为云obs在java中的使用

1、申请obs服务。 申请完成后&#xff0c;会获得以下几个配置信息&#xff1a; AK"****************************"; SK"******************************************************"; ENDPOINT"obs.*************************"; BUCKET_NAME&q…

麻吉POS集成:如何无代码开发实现电商平台和CRM系统的高效连接

麻吉POS集成的前沿技术&#xff1a;无代码开发 在竞争激烈的电商市场中&#xff0c;商家们急需一种高效且易于操作的技术手段来实现系统间的快速连接与集成。麻吉POS以其前沿的无代码开发技术&#xff0c;让这一需求成为可能。无代码开发是一种允许用户通过图形用户界面进行编…

STDP突触设计(一)

最近看了很多的STDP的工作原理&#xff0c;比如 SNN系列&#xff5c;学习算法篇(6)脉冲时序依赖可塑性STDP_脉冲时间依赖可塑性-CSDN博客 Spike-Timing Dependent Plasticity - Scholarpedia 这两篇的介绍的代码非常的详细&#xff0c;我就不再赘述了 我设计的STDP的是基于…

了解 ignore_above 参数对 Elasticsearch 中磁盘使用的影响

在 Elasticsearch 中&#xff0c;ignore_above 参数允许你忽略&#xff08;而不是索引&#xff09;长于指定长度的字符串。 这对于限制字段的大小以避免性能问题很有用。 在本文中&#xff0c;我们将探讨 “ignore_above” 参数如何影响 Elasticsearch 中字段的大小&#xff0c…

力扣225-用队列实现栈

文章目录 力扣225-用队列实现栈示例代码实现总结收获 力扣225-用队列实现栈 示例 代码实现 class MyStack {Queue<Integer>queue1;Queue<Integer>queue2;public MyStack() {queue1new LinkedList<Integer>();queue2new LinkedList<Integer>();}public…

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

C/PTA —— 13.指针2&#xff08;课内实践&#xff09; 一.函数题6-1使用函数实现字符串部分复制6-2 拆分实数的整数部分和小数部分6-3 存在感 二.编程题7-1 单词反转 一.函数题 6-1使用函数实现字符串部分复制 void strmcpy(char* t, int m, char* s) {int len 0;char* ret …