学习->C++篇十八:一文总结C++的异常

news2024/12/28 5:33:51

目录

C++为什么要引入异常?

什么是异常?

怎么使用异常处理错误?

异常的抛出规则:

异常的匹配规则:

单个catch语句,不能完全处理掉异常?重新抛出异常

什么是异常安全问题?

什么会导致异常安全问题?

异常规范有何作用?怎么做?

何为异常体系?

总结C++异常的优缺点

优点

缺点


C++为什么要引入异常?

首先看C语言传统处理错误的方式,主要有两种:

1.用assert,当不满足条件的时候直接终止程序,缺陷是用户难以接受

2.返回错误码,很多系统调用都是把错误码放在了errno中,缺点是需要程序员自己去用错误码获取错误信息,比如strerror(errno)

为了更好地处理错误,C++引入异常。

什么是异常?

异常:异常是一种处理错误的方式,当函数发现自己无法处理错误的时候,就可以抛出异常,函数的直接调用者或者间接调用者可以捕获这个异常,从而去处理这个错误。

怎么使用异常处理错误?

C++处理异常的三个关键字

throw catch try

语法格式:

try
{
  // 保护的标识代码
}catch( ExceptionName e1 )
{
  // catch 块
}catch( ExceptionName e2 )
{
  // catch 块
}catch( ExceptionName eN )
{
  // catch 块
}

异常的抛出规则:

- 抛出的对象类型决定了哪一个catch语句捕获异常

- 处理代码是与抛出类型匹配,而且离抛异常位置最近的那一块

- 抛出异常对象后,因为抛出的异常对象可能是一个临时的对象,所以捕获异常的语句会生成一个拷贝的对象,在catch语句之后就会销毁这个拷贝的对象

- catch(...)可以捕获任意类型的异常

- 可以抛出派生类对象使用基类类型捕获

异常的匹配规则:

- 首先检查本身是否在try语句块内部,如果是就查找相应的catch语句,如果有匹配就在其地方处理

- 然后没有匹配到catch则退出当前的函数栈,在调用函数的栈中查找匹配的catch

- 当达到主函数main的栈还没有匹配成功时,就会终止程序

- 找到匹配的catch语句并处理之后,就会往catch语句后面继续执行

简单代码理解一下调用函数栈:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>

using std::cout;
using std::endl;

void fun2()
{
	throw 100;
	cout << "fun2" << endl;
}

void fun1()
{
	fun2();
}

int main()
{
	try {
		fun1();
	}
	catch (int a)
	{
		cout << "捕获异常a:" << a << endl;
	}
	catch (...)
	{
		printf("捕获任意类型的异常\n");
	}
	return 0;
}

输出:

单个catch语句,不能完全处理掉异常?重新抛出异常

- 当单个catch语句,不能完全处理掉异常,在经过一些处理之后想交给外层调用的函数再来处理,catch语句块中就可以通过throw;重新抛出异常传递给更上层的函数处理异常

什么是异常安全问题?

由于抛异常导致的资源安全问题

什么会导致异常安全问题?

构造函数中抛出异常,可能导致对象没有完全初始化或者对象不完整

析构函数完成资源的清理,最好不要在其中抛出异常,否则可能导致资源泄露

在new和delete当中抛出异常导致内存泄露,在lock和unlock之间抛出异常导致死锁,C++用来RAII 思想来解决上述问题

异常规范有何作用?怎么做?

目的是为了让函数的使用者知道有可能抛出的异常有哪些类型,在函数后面加(类型),列出函数可能抛出的所有异常的类型

函数后面接throw()表示不抛异常

如果没有异常接口的声明,则此函数可以抛任何类型的异常

C++新增关键字noexcept表示不会抛异常

何为异常体系?

简单而言是一套继承体系,子类直接或间接派生自同一基类。

自定义异常体系:制订一套继承规范体系,大家都抛出的是继承于同一个基类的派生类对象,只要捕获基类类型就可以了

C++标准库的异常体系

总结C++异常的优缺点

优点

- 相比于错误码的方式,可以更清晰的展示出错误信息,可以更好的定位错误

- 返回错误码的方式在函数调用链当中得层层返回错误,最外层才能拿到错误,但是抛异常则可以一次性跳到最外层

- 使用许多的第三方库需要使用异常

- 部分函数使用异常更好处理,比如T& operator这样的不确定返回值类型的函数

缺点

- 抛异常可能会导致执行流乱跳,导致执行流非常混乱,使跟踪调试分析程序的时候比较困难

- C++没有垃圾回收机制,有了异常之后,可能导致资源泄露等问题,即异常安全问题需要使用RAII来处理资源管理问题,有一定学习成本

- C++标准库异常体系定义的不好,自定义的异常体系较多,较为混乱

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

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

相关文章

一、绘制折线图

Origin-绘图 一、新建绘图表格 Add New Column&#xff1a;新建一列 Set as→Y Error设置新列为Y误差 Long Name&#xff1a;X轴和Y轴名称&#xff1b;Units&#xff1a;单位&#xff1b;Comments&#xff1a;注释&#xff1b; 二、绘图 绘制折线图&#xff1a; 选择X、Y、…

2022年,转行IT学哪些编程语言更容易拿高薪?

人们都说年头年尾都是给自己进行规划最好的时段&#xff0c;想要学习编程的你现在是不是也开始进行规划了呢&#xff1f; 不过对大部分人来说&#xff0c;最犹豫的问题也摆在面前&#xff0c;编程语言众多&#xff0c;不知道学什么才能对后续的就业和职业发展有更好的作用。 …

PyTorch 2.0 之 Dynamo: 窥探加速背后的真相

前言 PyTorch 2.0 算是正式官宣了&#xff0c;预计在明年 3 月和大家见面。官方的 blog 宣发了非常多的内容&#xff0c;但是阅读下来不难发现&#xff0c;几乎所有的性能提升、体验优化都源自于 PyTorch 新设计的即时编译工具&#xff1a;Dynamo。 PyTorch eager 模式极佳的…

Flink 在米哈游的应用实践

摘要&#xff1a;本文整理自米哈游大数据实时计算团队负责人张剑&#xff0c;在 Flink Forward Asia 2022 主会场的分享&#xff0c;本篇内容主要分为三个部分&#xff1a;发展历程和平台建设场景应用实践未来展望Tips&#xff1a;点击「阅读原文」获取演讲 ppt01发展历程和平台…

分享一种通信协议的应用编程原理和思路

已剪辑自: https://mp.weixin.qq.com/s/wy-flva6pCNqHV3ObeLPCQ 嵌入式开发过程中&#xff0c;UART、 CAN、 USB等通信基本离不开通信协议。 下面给大家分享一种通信协议&#xff08;MAVLink&#xff09;在应用编程中的编程原理和思路。 本节提供“MAVLink发送接收例程”例程下…

[FTP] ftp通信协议抓包分析

想在ESP32上用TCP来实现ftp服务器&#xff0c;抓一下ftp通信包分析一下。总的来说就是两个TCP通道&#xff0c;一个命令通道&#xff0c;一个数据通道&#xff1b;数据通道只有在遍历目录、下载、上传的时候才开启&#xff0c;其余时候均不开启&#xff1b;主要就是协议对接好就…

【认识】wireshark使用教程

本文章&#xff0c;是简单粗暴学习Wireshark的抓包功能后&#xff0c;记录的一些笔记。 1 Wireshark简介及抓包原理及过程 1.1 简介 Wireshark是1个网络封包分析软件。网络封包分析软件的功能是截取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用…

从盒马生鲜迫切转型升级有感而发,疫情之后,路在何方

据悉&#xff0c;针对浦东地区目前突增的需求&#xff0c;市民线上采买生活物资的订单激增&#xff0c;饿了么联合包括每日优鲜、大润发在内的主要生鲜买菜商户&#xff0c;一起增加运力配合&#xff1b;盒马生鲜也对接了上海之外的山东、云南等省外基地&#xff0c;以避免中间…

JVM核心知识详解

文章目录1. JVM内存分配程序计数器虚拟机栈栈帧都有哪些内容栈内存溢出线程运行诊断演示1&#xff08;cpu占用过多&#xff09;演示2&#xff08;死锁&#xff09;本地方法栈堆堆内存诊断jmp诊断堆内存jconsole诊断堆内存jvisualvm诊断堆内存方法区直接内存java操作磁盘文件NIO…

IT行业分析报告:2022年哪个编程语言最受雇主公司喜欢?

2022年哪个编程语言最受雇主公司喜欢&#xff1f; 被认为是朝阳行业的IT互联网&#xff0c;软件工程师的平均年薪只涨了0.8%&#xff0c;再加上这两年互联网“寒冬”的说法&#xff0c;很多人不禁会问&#xff0c;现在还能入行IT互联网吗&#xff1f; 今天给大家整理了一份IT行…

Vue全局共享数据之globalData,vuex,本地存储使用方法

目录 一、globalData 二、vuex存储方式 1.vue2用法&#xff0c;2.vue3用法 三、本地存储 uniapp的数据缓存 写在最前面&#xff0c;把vue能用到的存储方法都整理拿出来&#xff0c;方便阅读以及工作用。&#x1f349;&#x1f349;&#x1f349;可以收藏起来即拿即用 Vue全局共…

杨旸:从边缘智能迈向泛在智能

内容来源&#xff1a;2022年11月12日&#xff0c;在全球边缘计算大会上海站上&#xff0c;我们非常荣幸邀请到了特斯联集团首席科学家杨旸博士来分享&#xff0c;杨旸博士曾任上海科技大学教授、科道书院院长、上海雾计算实验室主任&#xff1b;科技部“第五代移动通信系统&…

win10VS2017安装boost库

安装boost库参考&#xff1a;Windows下VS2017下boost库安装配置 https://blog.51cto.com/u_15179769/5633439 下载boost库 官方网站&#xff1a;https://www.boost.org/ 下载链接&#xff1a;https://www.boost.org/users/history/version_1_67_0.html 搜索vs开发人员命令…

JavaWeb框架(一):Web入门,Http的请求和响应,https介绍,Web实战自定义服务器

Servlet入门 MVC实战项目 仓储管理系统JavaWeb入门介绍Http协议Http请求数据格式Http响应数据格式Web实战Demo&#xff1a;自定义服务器对比Https协议总结Redis章节复习已经过去&#xff0c;新的章节JavaWeb开始了&#xff0c;这个章节中将会回顾JavaWeb实战项目 仓储管理 代码…

LC-417. 太平洋大西洋水流问题(多源BFS、DFS)

417. 太平洋大西洋水流问题 难度中等558 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数…

[附源码]计算机毕业设计Python的文成考研培训管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

详细复习云开发~小程序【云存储、列表的下拉刷新、列表的分页加载】

文章目录一&#xff0c;云开发~云存储1-1&#xff0c;云开发控制台管理文件1-2&#xff0c;上传图片到云存储1-3&#xff0c;给商品列表加商品图片1-4&#xff0c;上传视频到云存储1-5&#xff0c;上传word&#xff0c;excel文件到云存储1-5-1&#xff0c;上传之前先选择文件1-…

我国数据库现状与未来发展趋势

作者&#xff1a;IT圈黎俊杰 一、数据库现状 &#xff08;一&#xff09;国际数据库市场现状 在看国内数据库市场现状前&#xff0c;先看一组国际市场数据库的应用情况。 以2021年4月份数据国际市场数据库热度排名为例&#xff0c;稳居前三的Oracle、MySQL 和 Microsoft SQL …

朗坤环境递交注册:拟募资11亿 陈建湘家族色彩浓厚

雷递网 雷建平 12月19日深圳市朗坤环境集团股份有限公司&#xff08;简称&#xff1a;“朗坤环境”&#xff09;日前更新招股书&#xff0c;并提交注册&#xff0c;准备在深交所创业板上市。朗坤环境计划募资11.22亿元&#xff0c;其中&#xff0c;6.57亿元用于中山市南部组团垃…

目标检测论文解读复现【NO.22】多尺度下遥感小目标多头注意力检测

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0…