【C++进阶】异常

news2024/9/25 3:28:49

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、C语言传统的处理错误的方式
  • 二、C++异常概念
  • 三、异常的抛出和匹配规则
      • 3.1 异常的抛出和捕获
      • 3.2 异常的重新抛出

一、C语言传统的处理错误的方式

C语言传统的处理错误的方式主要是通过返回值或者全局变量来表示函数执行的状态,但是这种方式存在以下缺陷:

  1. 终止程序。常见的方法就是写一个assert函数或exit函数。缺陷:终止程序的执行,导致程序的崩溃。但是一个程序在运行时需要保持稳定性。举一个例子:大家在使用计算器时,当除数为0时,程序会崩溃吗?显然是不会的,而是会报以下错误信息

在这里插入图片描述

  1. 返回错误码。缺陷:需要程序员自己去查找对应的错误,比较麻烦。

C++针对上面的不足,引入了 异常 的概念,不会终止程序,并且会将错误信息详细介绍。

二、C++异常概念

异常是面向对象语言处理错误的一种方式。当一个函数出现自己无法处理的错误时,可以抛出异常,然后直接或者间接的调用者处理这个错误。

因此C++提供了以下异常相关的关键字

  • throw当问题出现时,程序会抛出一个异常。这是通过使用throw关键字来完成的
  • catch用于捕获异常,可以有多个catch进行捕获
  • trytry块中一般是可能出现异常的代码,它后面通常跟着一个或多个catch块。

注意:可以抛出任意类型的对象。抛出的异常必须捕获。try要和catch匹配使用,catch里的内容抛出异常时才执行,没有异常,不执行。

举一个除数为0的例子:

#include <iostream>
using namespace std;

int test()
{
    int a, b;
    cin >> a >> b;
    if (b == 0)
    {
        // throw用来抛出异常,异常的描述
        throw "除数不能为0";
    }
    return a / b;
}

int main()
{
    try
    {
        // try里放会可能出现异常的代码
        cout << test() << endl;
    }
    // catch用来捕获异常
    catch (const char* a)
    {
        cout << a << endl;
    }

    return 0;
}

【运行结果】

在这里插入图片描述

三、异常的抛出和匹配规则

3.1 异常的抛出和捕获

  1. 异常是通过抛出(throw)对象而引发的,并且抛出的对象可以是任意类型,其对象的类型决定了应该激活哪个catch的处理代码。
#include <iostream>
using namespace std;

int test()
{
    int a, b;
    cin >> a >> b;
    if (b == 0)
    {
        // throw用来抛出异常,异常的描述
        throw "除数不能为0";
    }
    return a / b;
}

int main()
{
    try
    {
        // try里放会可能出现异常的代码
        cout << test() << endl;
    }
    // catch用来捕获异常
    catch (const char* a)
    {
        cout << a << endl;
    }
	catch (int a)
	{
		cout << a << endl;
	}

    return 0;
}

就比如以上代码:throw的对象是字符串类型,因此当出现异常是,它激活的是第一个catch的处理代码,最后一定会输出"除数不能为0"

在这里插入图片描述

注意:如果catch类型和throw对象类型不匹配,会导致捕获失败,编译器就会报错。因此,C++规定:出现异常就必须被捕获

在这里插入图片描述

  1. 选中的处理代码(throw)是调用链中与该对象类型匹配且离抛出异常位置最近的那一个

在这里插入图片描述

【在函数调用链中异常栈展开匹配原则】

  • 首先检查throw本身是否在try块内部,如果是就查找匹配的catch语句。如果有匹配的,则调到catch的地方进行处理;如果没有匹配的catch则退出当前函数栈,继续在调用函数的栈中进行查找匹配的catch。如果到达main函数的栈,依旧没有匹配的,则终止程序,并报错。
  • 上述这个沿着调用链查找匹配的catch子句的过程称为栈展开。所以实际中我们最后都要加一个 catch(...)捕获任意类型的异常,否则当有异常没捕获,程序就会直接终止。
  • 找到匹配的catch子句并处理以后,会继续沿着catch子句后面继续执行。

在这里插入图片描述

  1. catch(...)可以捕获任意类型的异常,问题是不知道异常错误是什么。
  2. 实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配,可以抛出的派生类对象,使用基类捕获,这个在实际中非常实用,我们后面会详细讲解这个。

3.2 异常的重新抛出

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

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

相关文章

MATLAB | 万圣节来画个简单的可爱鬼叭!

万圣节要到啦一起来画个可爱鬼吧~ 代码比较的短&#xff1a; 完整代码 figure(Units,normalized,Position,[.2,.1,.52,.72]); axgca;hold on;axis off; ax.DataAspectRatio[1,1,1]; ax.YDirreverse; ax.XLim[0,100]; ax.YLim[0,100]; [X,Y]meshgrid(linspace(0,1,200)); Zsq…

当任务数超过线程池的核心线程数时,如何让它不进入队列,而是直接启用最大线程数

线程池工作原理 当我们提交一个任务到线程池的时候&#xff0c;它的工作原理分为四步&#xff1a; 第一步&#xff0c;预热核心线程 第二步&#xff0c;把任务添加到阻塞队列 第三步&#xff0c;如果添加到阻塞队列失败&#xff0c;则创建非核心线程增加处理效率 第四步&#x…

nodejs+python+php+微信小程序-基于安卓android的健身服务应用APP-计算机毕业设计

考虑到实际生活中在健身服务应用方面的需要以及对该系统认真的分析&#xff0c;将系统权限按管理员和用户这两类涉及用户划分。  则对于进一步提高健身服务应用发展&#xff0c;丰富健身服务应用经验能起到不少的促进作用。 健身服务应用APP能够通过互联网得到广泛的、全面的宣…

轻量封装WebGPU渲染系统示例<10>- 容器(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/REntity3DContainerTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5.…

Doris数据库FE——全局事务状态机

begin; create database db1; ERROR 1105 (HY000): TException, msg: org.apache.thrift.TException: This is in a transaction, only insert, commit, rollback is acceptable从上述报错可以看出begin、commit、rollback等操作只有和insert操作结合使用。从上述可以猜测Doris…

【腾学汇的第1个实验代码】应用Matplotlib绘制图标分析

import matplotlib.pyplot as plt import numpy as np #Jupter Notebook 里面显示图片 %matplotlib inline#1.1.1 线形图 np.random.seed(42) #产生随机种子 y np.random.randn(30) #产生随机数 plt.plot(y, "r--o")#绘图&#xff1a;红色--虚线--圆形# 1.1.2 线条颜…

【【哈希应用】位图/布隆过滤器】

位图/布隆过滤器 位图位图概念位图的使用位图模拟实现 布隆过滤器布隆过滤器概念布隆过滤器的使用布隆过滤器模拟实现 位图/布隆过滤器应用&#xff1a;海量数据处理哈希切分 位图 位图概念 计算机中通常以位bit为数据最小存储单位&#xff0c;只有0、1两种二进制状态&#x…

2D网页游戏开发引擎

2D网页开发引擎是用于创建富有交互性和动画效果的2D网页应用程序的工具。以下是一些常用的2D网页开发引擎以及它们的主要特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.Phaser&#xff1a; P…

【ES专题】ElasticSearch快速入门

目录 前言从一个【搜索】说起 阅读对象前置知识笔记正文一、全文检索1.1 什么是【全文检索】1.2 【全文检索】原理1.3 什么是倒排索引 二、ElasticSearch简介2.1 ElasticSearch介绍2.2 ElasticSearch应用场景2.3 数据库横向对比 三、ElasticSearch环境搭建3.1 Windows下安装3.2…

Qlik Sense Enterprise 忘记PostgreSQL密码

在 Windows 上安装 Qlik Sense Enterprise 期间会提供密码。如果您忘记了该密码&#xff0c;则无法找回&#xff1b;但是&#xff0c;可以按照以下步骤重置密码。 如何在 Qlik 中重置忘记的 PostgreSQL 密码... - Qlik Community - 1712725 如果该过程完成后记录了密码错误的…

Java架构师面向对象技术建模

目录 1 导学2 面向对象开发2.1 面向对象需求建模2.2 面向对象的设计原则3 统一建模语言UML4 设计模式想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 面向对象开发 对象:由数据及其操作所构成的封装体,是系统中用来描述客观事务的个实体,是构成系统的一个基…

yolov5 pt转成nccn_yolov5

一&#xff1a;转换环境准备 python版本为Python 3.8.0&#xff0c;需要安装对应的版本包&#xff0c;torch1.10.0 torchvision0.11.0 torchaudio0.10.0 pip3 install torch1.10.0 torchvision0.11.0 torchaudio0.10.0 -f https://download.pytorch.org/whl/torch_stable.html…

小红书平台用户数据分析与可视化

管理器、网页下载器、网页解析器、输出管理器这四个模块去搭建一个爬虫框架&#xff0c;将爬虫流程统一化&#xff0c;将通用的功能进行抽象&#xff0c;减少重复工作。要求实现的爬虫框架可以进行分布式爬取&#xff0c;解决爬虫的统一调度和统一去重&#xff0c;以及存储问题…

Ceph入门到精通-bluestore IO流程及导入导出

bluestore 直接管理裸设备&#xff0c;实现在用户态下使用linux aio直接对裸设备进行I/O操作 写IO流程&#xff1a; 一个I/O在bluestore里经历了多个线程和队列才最终完成&#xff0c;对于非WAL的写&#xff0c;比如对齐写、写到新的blob里等&#xff0c;I/O先写到块设备上&am…

Mybatis 多对一和一对多查询

文章目录 Mybatis 多对一 and 一对多查询详解数据库需求Mybatis代码注意 Mybatis 多对一 and 一对多查询详解 数据库 员工表 t_emp 部门表 t_dept CREATE TABLE t_emp (emp_id int NOT NULL AUTO_INCREMENT,emp_name varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci…

2023年华为云双11有什么优惠活动?详细攻略来了!

随着双十一的临近&#xff0c;华为云也开启了双11大促&#xff0c;推出了“华为云11.11”活动&#xff0c;那么&#xff0c;2023年华为云双11的优惠活动究竟有哪些呢&#xff1f;本文将为大家详细介绍。 一、华为云双11活动入口 活动地址&#xff1a;点此直达 二、华为云双11…

DSP 开发例程(5): tcp_server

目录 DSP 开发例程(5): tcp_server创建工程源码编辑tcp_echo.chelloWorld.c 调试说明 DSP 开发例程(5): tcp_server 此例程实现在 EVM6678L 开发板上创建 TCP Server进程, 完成计算机与开发板之间的 TCP/IP 通信. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程…

JAVA基础(JAVA SE)学习笔记(十)多线程

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第三阶段&#xff1a;Java高级应用 9.异常处理 10.多线程 11.常用类和基础API 12.集合框架 13.泛型 14…

浅谈js代码的封装方法(2023.10.30)

常见的js代码封装方法 2023.10.30 需求1、js代码封装的优缺点2、js代码封装方式2.1 方式一&#xff1a;function function declarations2.1.1 示例 2.2 方式二&#xff1a;class2.2.1 class declarations2.2.2 Class expressions 2.3 变量函数2.4 变量闭包匿名函数2.5 闭包函数…

TiDB 企业版全新升级,平凯数据库核心特性全解读

作为 TiDB 企业版的全新升级&#xff0c;平凯数据库一经推出便广受媒体及用户关注。 近日&#xff0c;平凯星辰首席科学家丁岩在“平凯数据库全解读”活动中&#xff0c;首次详细介绍了平凯数据库的核心能力。 本文为丁岩演讲实录全文&#xff0c;为方便阅读&#xff0c;已做部…