当前位置: 首页 > news >正文

C++---异常处理

异常处理

  • 异常处理
  • try语句块和throw表达式
  • 异常的抛出和捕获
    • 异常的抛出和匹配原则
  • 异常安全
  • 异常规范
  • 标准异常

异常处理

异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。当程序的某部分检测到一个他无法处理的问题时,需要用到异常处理。如果程序中含有可能引发异常的代码,那么通常会有专门的代码处理问题。例如“如果程序的问题是输入无效,则异常处理部分可能会要求用户重新输入正确的数据。

异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。

在C++中,异常处理包括:

  • throw表达式(throw expression),异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说thrwo引发了异常。
  • try语句块(try block),异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch子句(catch clause)结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句处理异常,所以他们也被称作 “异常处理代码(exception handler)”。
  • 一套异常类(execption class),用于在throw表达式和相关的catch子句之间传递异常和具体信息。

try语句块和throw表达式

如果有一个块抛出一个异常,捕获异常的方法会使用try和catch关键字。try块中放置可能抛出异常的代码,try块中的代码被称为保护代码。

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

try语句块的一开始是关键字try,跟在try块后面的是一个或者多个catch子句。catch子句包括三部分, 关键字,catch,括号内一个(可能未命名的)对象的声明(称作异常声明(exception declaration))。当选中了某个catch子句处理异常之后,执行与之对应的块。 在try语句块内声明的变量在块外部是无法访问的,特别是在catch子句内也无法访问。


程序的异常检测部分使用throw表达式引发一个异常。 throw+表达式;,表达式的类型就是抛出的异常类型。

double Division(int a, int b)
{// 当b == 0时抛出异常if (b == 0)throw "Division by zero condition!";elsereturn ((double)a / (double)b);
}
void Func()
{int len, time;cin >> len >> time;cout << Division(len, time) << endl;
}
int main()
{try {Func();}catch (const char* errmsg){cout << errmsg << endl;}catch (...) {cout << "unkown exception" << endl;}return 0;}

异常的抛出和捕获

异常的抛出和匹配原则

在复杂的系统中,程序在遇到抛出异常的代码前,器质性路径可能已经经过了多个try语句块。如,一个try语句块可能调用了包含另一个try的语句块的函数,新的try语句块可能调用了包含有一个try语句块的新函数,以此类推。

寻找处理代码的过程与函数调用链刚好相反。当异常被抛出的时候,首先搜索抛出该异常的函数。如果没有找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找。如果还是没有找到匹配的catch子句,这个新的函数也被终止,继续搜索调用它的函数。以此类推,沿着程序执行路径逐层回退,直到找到适当类型的catch’子句为止—这个过程被称为 栈展开

如果最终还是没有找到任何匹配的catch子句(也就是到达main函数的栈,依旧没有匹配的),程序转到名为 terminate的标准库函数。该函数的行为于系统有关,一般情况下,执行该函数将导致程序非正常退出。

  1. 异常是通过抛出对象引发的,该对象的类型决定了应该激活哪个catch的处理代码。
  2. 被选中的处理代码是调用链中与该对象类型匹配且离抛出异常为止最近的那一个
  3. 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁。(这里的处理类似于函数的传值返回)
  4. catch(…)可以捕获任意类型的异常,问题是不知道异常错误是什么
  5. 实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配,可以抛出的派生类对象,使用基类捕获,这个在实际中非常实用。

异常安全

异常中断了程序的正常流程。异常发生时,调用者请求的一部分计算可能已经完成了,另一部分没有完成。略过的程序可能会导致对象处于无效或者未完成的状态,或者资源没有正常释放等等问题。那些在异常发生期间正确执行了 “清理”工作的程序被称作异常安全(exception safe)的代码。

异常规范

  1. 异常规格说明的目的是为了让函数使用者知道该函数可能抛出的异常有哪些。可以在函数的后面接 throw(类型),列出这个函数可能抛出的的所有异常类型。
  2. 函数的后面接throw(),表示函数不抛异常
  3. 若无异常接口声明,则此函数可以抛出任何类型的异常。
// 这里表示这个函数会抛出A/B/C/D中的某种类型的异常
void fun() throw(A,B,C,D);
// 这里表示这个函数只会抛出bad_alloc的异常
void* operator new (std::size_t size) throw (std::bad_alloc);
// 这里表示这个函数不会抛出异常
void* operator delete (std::size_t size, void* ptr) throw();
// C++11 中新增的noexcept,表示不会抛异常
thread() noexcept;
thread (thread&& x) noexcept

标准异常

C++标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类也可以在用户编写的程序中使用,他们定义在4个头文件中。

  • exception头文件定义了最通用的异常类exception。它只报告异常的发生,不提供任何额外信息。

  • stdexcept头文件定义了几种常用的异常类。

  • new头文件定义了bad_alloc异常类型。

  • type_info头文件定义了bad_cast异常类型。

    定义的异常类

异常名问题
exception最常见的问题
runtime_error只有在运行时才能检测出的问题
range_error运行时错误:生成的结果超出了有意义的值域范围
overflow_error运行时错误:计算上溢
underflow_error运行时错误:计算下溢
logic_error程序逻辑错误
domain_error逻辑错误:参数对应的结果值不存在

异常类型只定义了一个名为what的成员函数,该函数没有任何参数,返回值是一个指向C风格字符串的 const char*该字符串的目的是提供关于异常的一些文本信息。

what函数返回的字符串的内容与异常对象的类型有关。如果异常类型有一个字符串初始值,则what返回该字符串。对于无初始值的异常类型来说,what返回的内容由编译器决定。

相关文章:

C++---异常处理

异常处理 异常处理try语句块和throw表达式异常的抛出和捕获异常的抛出和匹配原则 异常安全异常规范标准异常 异常处理 异常是指存在于运行时的反常行为&#xff0c;这些行为超出了函数正常功能的范围。当程序的某部分检测到一个他无法处理的问题时&#xff0c;需要用到异常处理…...

接口自动化测试(Python+Requests+Unittest)

(1)接口自动化测试的意义、前后端分离思想 接口自动化测试的优缺点&#xff1a; 优点&#xff1a; 测试复用性。 维护成本相对UI自动化低一些。 为什么UI自动化维护成本更高&#xff1f; 因为前端页面变化太快&#xff0c;而且UI自动化比较耗时&#xff08;比如等待页面元素的…...

驱动开发,IO多路复用(select,poll,epoll三种实现方式的比较)

1.IO多路复用介绍 在使用单进程或单线程情况下&#xff0c;同时处理多个输入输出请求&#xff0c;需要用到IO多路复用&#xff1b;IO多路复用有select/poll/epoll三种实现方式&#xff1b;由于不需要创建新的进程和线程&#xff0c;减少了系统资源的开销&#xff0c;减少了上下…...

大数据-玩转数据-oracel字符串分割转化为多列

一、建表 create table split_string_test(id integer primary key,test_string varchar2(500) );二、插入测试数据 insert into split_string_test values(1, 10,11,12,13,14,22); insert into split_string_test values(2, 22,23,24); insert into split_string_test valu…...

GCP设置Proxy来连接Cloud SQL

在之前的文章用Google CDC来同步Cloud SQL的数据到Bigquery_gzroy的博客-CSDN博客中&#xff0c;我通过在一个VM上设置反向代理的方式&#xff0c;使得Datastream可以通过私用连接连到Cloud SQL数据库进行数据复制。但是这种方式不太方便&#xff0c;主要是VM的状态我们不太方便…...

Python:为何成为当下最热门的编程语言?

文章目录 &#x1f34b;引言&#x1f34b;1. 简单易学&#x1f34b;2. 多领域应用&#x1f34b;3. 强大的社区支持&#x1f34b;4. 丰富的库和框架&#x1f34b;5. 跨平台兼容&#x1f34b;6. 开源和免费&#x1f34b;7. 数据科学和人工智能的崛起&#x1f34b;8. 自动化和脚本…...

【echarts入门】:vue项目中应用echarts

一.安装echarts 在项目集成终端下载echarts npm install echarts --save 二.全局引入 创建/components/echarts/index.js // 引入 echarts 核心模块&#xff0c;核心模块提供了 echarts 使用必须要的接口。 import * as echarts from "echarts/core";/** 引入任…...

Seata 源码篇之AT模式启动流程 - 上 - 02

Seata 源码篇之AT模式启动流程 - 02 自动配置两个关键点 初始化初始化TM初始化RM初始化TC 全局事务执行流程TM 发起全局事务GlobalTransactional 注解处理全局事务的开启 TM 和 RM 执行分支事务IntroductionDelegatingIntroductionInterceptorDelegatePerTargetObjectIntroduct…...

FFMPEG视频压缩与Python使用方法

一、简介 FFMPEG 是一个完整的&#xff0c;跨平台的解决方案&#xff0c;记录&#xff0c;转换和流音频和视频。 官网&#xff1a;https://ffmpeg.org/ 二、安装 1、Linux&#xff1a; sudo apt install ffmpeg 2、Mac: brew install ffmpeg 3、Windows: 下载文件&#…...

SpringMVC自定义注解---[详细介绍]

一&#xff0c;对于SpringMVC自定义注解概念 是一种特殊的 Java 注解&#xff0c;它允许开发者在代码中添加自定义的元数据&#xff0c;并且可以在运行时使用反射机制来获取和处理这些信息。在 Spring MVC 中&#xff0c;自定义注解通常用于定义控制器、请求处理方法、参数或者…...

5.4 转换数据

5.4 转换数据 5.4.1 哑变量处理类别型数据5.4.2 离散化连续型数据1、等宽法2、等频法3、聚类分析法 数据集 E:/Input/ptest.csv 5.4.1 哑变量处理类别型数据 数据分析模型中有相当一部分的算法模型都要求输入的特征为数值型&#xff0c;但实际数据中特征的类型不一定只有数值…...

雷池社区WAF:保护您的网站免受黑客攻击 | 开源日报 0918

keras-team/keras Stars: 59.2k License: Apache-2.0 Keras 是一个用 Python 编写的深度学习 API&#xff0c;运行在机器学习平台 TensorFlow 之上。它 简单易用&#xff1a;减少了开发者认知负荷&#xff0c;使其能够更关注问题中真正重要的部分。灵活性强&#xff1a;通过逐…...

链表反转-LeetCode206

**题目&#xff1a;**给你单链表的头结点head&#xff0c;请反转链表&#xff0c;并返回反转后的链表。 示例&#xff1a; 输入&#xff1a;head [1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5] 输出&#xff1a;[5&#xff0c;4&#xff0c;3&#xff0c;2&#x…...

北邮22级信通院数电:Verilog-FPGA(3)实验“跑通第一个例程”modelsim仿真及遇到的问题汇总(持续更新中)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 注意&#xff1a;本篇文章所有绝对路径的展示都来自…...

4G工业路由器,开启智能工厂,这就是关键所在

​提到工业物联网,首先联想到的就是数据传输。要把海量的工业数据从设备端传到控制中心,无线数传终端就发挥着重要作用。今天就跟着小编来看看它的“联”是怎么建立的吧! 原文&#xff1a;https://www.key-iot.com/iotlist/1838.html 一提到无线数传终端,相信大家首先想到的是…...

计组-机器字长、存储字长、指令字长以及和他们有关的机器位数

&#x1f333;&#x1f333;&#x1f333;前言&#xff1a;本文总结了机器字长、存储字长、指令字长的概念以及和它们相关的机器位数。 目录 字长 机器字长 指令字长 存储字长 寄存器的位数 总结 字长 &#x1f31f;字长一个字中的二进制位数。 &#x1f31f;字长由微处…...

解决express服务器接收post请求报错:“req.body==> undefined“

现象如下&#xff1a; 解决办法&#xff1a;在代码中加入body-parser解析 const bodyParser require("body-parser"); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); 参考&#xff1a; How to fix "req.body undefined&q…...

5.zigbee的开发,串口putchar重定向(使用print),单播实验,usb抓包实验

一。实验&#xff1a;单播 实验要求&#xff1a; 实现终端定时向协调器发送给“好好学习”字符串&#xff0c;并且从终端打印出来。 要求&#xff1a; 指定端点为 0x0005 指定簇为 0x0003 1.进入应用层SampleApp.c中&#xff0c;串口的重定向 报错&#xff…...

解决AU报“MME无法使用“问题

今天在Adobe Audition(简称AU)软件&#xff0c;打开麦克风时&#xff0c;弹出如下错误:“加载默认的输入和输出设备失败:MME设备内部错误”&#xff0c;如图(1)所示&#xff1a; 图(1) AU报“MME设备内部错误” 继续点击AU菜单栏上的【编辑】–》首选项–》音频硬件&#xff0c…...

Maven 安装配置

Maven 安装配置 文章目录 Maven 安装配置一、下载 Maven二、解压Maven核心程序三、指定本地仓库四、配置阿里云镜像仓库4.1 将原有的例子配置注释掉4.2 加入新的配置 五、配置 Maven 工程的基础 JDK 版本六、配置环境变量6.1 检查 JAVAHOME 配置是否正确6.2 配置 MAVENHOME6.3 …...

2026年AI模型API中转站大排名!解析各平台优势,为企业与开发者精准选型

2026年5月&#xff0c;在中国广州&#xff0c;随着AI大模型技术不断迭代并在各产业全面落地&#xff0c;企业级API中转服务市场已步入成熟竞争阶段。技术稳定性、场景适配度以及综合性价比成为企业选择API中转站时的核心考量因素。近日&#xff0c;行业第三方评测机构发布了《2…...

用Godot 4.0复刻街霸3D名场面:从Blender绑定到动画状态机的完整实战

用Godot 4.0复刻街霸3D名场面&#xff1a;从Blender绑定到动画状态机的完整实战 街机厅里那些经典格斗游戏的3D重制总能勾起玩家的情怀&#xff0c;而今天我们将用Godot 4.0完整复刻《街霸》中隆的招牌必杀技——从Blender的骨骼绑定到Godot动画状态机的全流程实现。这不是简单…...

Java面试跳槽需要提前准备什么内容?

今年时间属实过得挺快的&#xff0c;想必有很多小伙伴这会已经在为下半年面试跳槽做准备了。临近面试肯定是要想办法提升自己的面试能力&#xff0c;这个时候如果还去一昧地提升自己的代码能力对面试是毫无帮助的。大多数人在面试的时候都会遇到以下几种情况&#xff08;大家可…...

别再死记公式了!用“信号与系统”的视角,5分钟看懂卡尔曼滤波与互补滤波的本质区别

从频域视角解析卡尔曼滤波与互补滤波的本质差异 在机器人控制和姿态估计领域&#xff0c;数据融合算法始终是工程师们关注的焦点。当我们面对陀螺仪和加速度计这两种各具特色的传感器数据时&#xff0c;如何有效融合它们的长处&#xff0c;同时规避各自的短板&#xff0c;成为构…...

cpdown:精准下载Git仓库文件,告别克隆整个项目的低效操作

1. 项目概述与核心价值最近在整理本地开发环境&#xff0c;发现一个高频痛点&#xff1a;从各种代码托管平台&#xff08;比如 GitHub、GitLab、Gitee&#xff09;下载单个文件或特定目录时&#xff0c;总是特别麻烦。要么得克隆整个仓库&#xff0c;动辄几百兆&#xff0c;浪费…...

拆解LCD12864串行时序:用STM32的GPIO模拟,一步步带你读懂那张时序图

深入解析LCD12864串行通信&#xff1a;用STM32 GPIO模拟时序的实战指南 在嵌入式开发中&#xff0c;液晶显示模块(LCD)是常见的人机交互界面&#xff0c;而LCD12864因其价格适中、显示内容丰富等特点被广泛使用。不同于简单的复制粘贴代码&#xff0c;真正理解其底层通信协议才…...

FPGA与ASIC核心技术对比与选型指南

1. FPGA与ASIC的本质差异解析在数字电路设计领域&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;和ASIC&#xff08;专用集成电路&#xff09;代表着两种截然不同的技术路线。FPGA本质上是一种"硬件可重构"的半导体器件&#xff0c;其核心结构由可编程逻辑…...

别再只用VLC看片了!手把手教你把它变成家庭流媒体服务器(支持UDP/TCP)

解锁VLC的隐藏技能&#xff1a;打造家庭专属流媒体系统的完整指南 你是否曾为在不同设备间切换观看本地视频而烦恼&#xff1f;每次都要用U盘拷贝或者忍受云盘缓慢的上传下载速度&#xff1f;其实&#xff0c;你电脑上那个熟悉的橙色锥形图标——VLC播放器&#xff0c;远比你想…...

Real-ESRGAN-GUI完整指南:3个技巧让模糊图片变高清的免费AI工具

Real-ESRGAN-GUI完整指南&#xff1a;3个技巧让模糊图片变高清的免费AI工具 【免费下载链接】Real-ESRGAN-GUI Lovely Real-ESRGAN / Real-CUGAN GUI Wrapper 项目地址: https://gitcode.com/gh_mirrors/re/Real-ESRGAN-GUI 你是否曾为模糊的老照片感到惋惜&#xff1f;…...

Simulink仿真报错‘积分器发散’?别慌,试试把ode45换成ode3并固定步长

Simulink仿真中积分器发散问题的深度解析与实战解决方案 当你在Simulink中进行控制系统仿真时&#xff0c;突然弹出一条令人不安的错误信息——"Derivative not finite"或"singularity"&#xff0c;这往往意味着你的仿真遇到了积分器发散问题。这种报错不…...