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

C++入门:异常处理

异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。

异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw

  • throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。

  • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。

  • try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。

const throw() 不是函数,这个东西叫异常规格说明,表示 what 函数可以抛出异常的类型,类型说明放到 () 里,这里面没有类型,就是声明这个函数不抛出异常,通常函数不写后面的 throw() 就表示函数可以抛出任何类型的异常。

异常规格说明

  1. 异常规格说明的目的是为了让函数使用者知道该函数可能抛出的异常有哪些。 可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:

void fun() throw(A,B,C,D);

2、若无异常接口声明,则此函数可以抛掷任何类型的异常。

  1. 不抛掷任何类型异常的函数声明如下:

#include 
#include 
using namespace std;class MyException
{
public:MyException(const char *message): message_(message){cout << "MyException ..." << endl;}MyException(const MyException &other) : message_(other.message_){cout << "Copy MyException ..." << endl;}virtual ~MyException(){cout << "~MyException ..." << endl;}const char *what() const{return message_.c_str();}
private:string message_;
};class MyExceptionD : public MyException
{
public:MyExceptionD(const char *message): MyException(message){cout << "MyExceptionD ..." << endl;}MyExceptionD(const MyExceptionD &other): MyException(other){cout << "Copy MyExceptionD ..." << endl;}~MyExceptionD(){cout << "~MyExceptionD ..." << endl;}
};void fun(int n) throw (int, MyException, MyExceptionD)
{if (n == 1){throw 1;}else if (n == 2){throw MyException("test Exception");}else if (n == 3){throw MyExceptionD("test ExceptionD");}}void fun2() throw()
{}int main(void)
{try{fun(2);}catch (int n){cout << "catch int ..." << endl;cout << "n=" << n << endl;}catch (MyExceptionD &e){cout << "catch MyExceptionD ..." << endl;cout << e.what() << endl;}catch (MyException &e){cout << "catch MyException ..." << endl;cout << e.what() << endl;}return 0;
}

C++ Primer 中关于 what()的解释:

在之前的例子里,我们使用了一个 throw 表达式以避免把两个代表不同书籍的 Sales_item 相加。我们假设执行 Sales_item 对象加法的代码是与用户交互的代码分离开的。其中与用户交互的代码负责处理发生的异常,它的形式可能如下所示:

while (cin >> item1 >> item2){try{//执行添加两个Sales_item对象的代码//如果添加失败,代码抛出一个runtime_error异常} catch (runtime_error err){//提醒用户两个ISBN必须一致,询问是否重新输入cout << err.what()<< "\nTry Again? Enter y or n" << endl;char c;cin >> c;İf (!cin || c == 'n')break;//跳出while循环}
}

程序本来要执行的任务出现在 try 语句块中,是因为这段代码可能会抛出一个 runtime_error 类型的异常。

try 语句块对应一个 catch 子句。该子句负责处理类行为 runtime_error 的异常。如果 try 语句块的代码抛出了runtime_error 异常,接下来执行 catch 块内的语句。在我们书写的 catch 子句中,数出一段提示信息要求用户指定程序是否继续。如果用户输入 n,执行 break 语句并退出 while 循环;否则,直接执行 while 循环的右侧花括号,意味着程序控制权条回到 while 条件部分准备下一次迭代。

给用户的提示信息中输出了 err.what() 的返回值。我们知道 err 的类型是 runtime_error,因此能推断 what 是 runtime_error 类的一个成员函数。每个标准库异常类都定义了名为 what 的成员函数。这些函数没有参数,返回值是 C 风格字符串(即 const char *)其中,runtime_error 的 what 成员函数返回的是初始化一个具体对象所用的 string 对象的副本。如果上一节编写的代码抛出异常,则本节的 catch 子句输出:

Data must refer to same ISBN
Try Again? Enter y or n

在 C++11 中,声明一个函数不可以抛出任何异常使用关键字 noexcept。

void mightThrow(); // could throw any exceptions.
void doesNotThrow() noexcept; // does not throw any exceptions.

下面两个函数声明的异常规格在语义上是相同的,都表示函数不抛出任何异常。

void old_stytle() throw();
void new_style() noexcept;

对于:

const char * what () const throw ()
{
//函数体
}

做几点说明,从左到右看:

1. const char * 表示返回值类型

2. what 是函数名称

3. () 是参数列表

4. const 表示该成员函数不能修改成员变量

5. throw() 是异常规格说明符。括号内写该函数可抛出的异常类型

上述 5 点均为函数的声明部分。

相关文章:

C++入门:异常处理

异常是程序在执行期间产生的问题。C 异常是指在程序运行时发生的特殊情况&#xff0c;比如尝试除以零的操作。异常提供了一种转移程序控制权的方式。C 异常处理涉及到三个关键字&#xff1a;try、catch、throw。throw: 当问题出现时&#xff0c;程序会抛出一个异常。这是通过使…...

C/C++每日一练(20230225)

目录 1. 工龄问题求解 ★ 2. 字符图形输出 ★★ 3. LRU 缓存机制 ★★★ 1. 工龄问题求解 给定公司N名员工的工龄&#xff0c;要求按工龄增序输出每个工龄段有多少员工。输入首先给出正整数N&#xff0c;即员工总人数&#xff1b; 随后给出N个整数&#xff0c;即每个员工…...

nyist最终淘汰赛第一场

我出的题喜欢吗 我要水题解所以每一篇题解都分一个博客 A 题解链接: Atcoder abc257 E_霾まる的博客-CSDN博客 构造贪心题 在本次淘汰赛中较难 B 题解链接: atcoder abc217 D_霾まる的博客-CSDN博客 STL二分题, 当然你可以数组二分, 相对麻烦一点 在本次淘汰赛中较简单…...

《零成本实现Web自动化测试--基于Selenium》 Selenium-RC

一. 简介 Selenium-RC可以适应更复杂的自动化测试需求&#xff0c;而不仅仅是简单的浏览器操作和线性执行。Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例&#xff0c;例如读写文件、查询数据库和E-mail邮寄测试报告。 当测试案例遇到selenium-IDE不支持的逻辑…...

来阿里我的收获是什么?(未完待续)

不知不觉来阿里两年多了&#xff0c;每天都过的很充实&#xff0c;感觉这段时间没有学到什么东西&#xff0c;但是又觉得收获满满&#xff0c;恰好又好久没有动笔写过些什么了&#xff0c;所以有了这个动笔念头。 之前技术方面记录的比较多&#xff0c;这次就记录一些比较磨心的…...

golang net/http库的学习

net/http 是 Golang 标准库中用来构建 HTTP 服务器和客户端的包&#xff0c;它提供了很多功能强大的方法和接口&#xff0c;可以让您方便地构建和处理 HTTP 请求和响应。下面是一些学习 net/http 的建议&#xff1a; 了解 HTTP 协议。在学习 net/http 之前&#xff0c;建议先了…...

Spring(AOP)

目录 1. 预备知识-动态代理 1.1 什么是动态代理1.2 动态代理的优势1.3 基于JDK动态代理实现2. AOP 2.1 基本概念2.2 AOP带来的好处3. Spring AOP 3.1 前置通知3.2 后置通知3.3 环绕通知3.4 异常通知3.5 适配器 1. 预备知识-动态代理 1.1 什么是动态代理 动态代理利用Java的反…...

服务搭建篇(六) Kafka + Zookeeper集群搭建

一.Zookeeper 1.什么是Zookeeper ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要 用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容 易出错的分布式一致性服务封装起来&#xff0c;构成一个…...

Go基础-可变参数函数

文章目录1 定义2 语法3 给可变函数参数传入切片4 修改可变参数函数中的切片1 定义 可变参数函数是一种参数个数可变的函数。 2 语法 语法 //关键字 函数名(参数1&#xff0c; elems为T类型的可变参数) 返回值类型 func name(params type, elems ...T) returntype{// 函数体 }…...

kali环境搭建

一、渗透为什么要使用kali&#xff1f; 1、系统开源 kali linux实际上是开源的操作系统&#xff0c;其中内置了几百种工具而且是免费的&#xff0c;可以非常方便的为测试提供上手即用的整套工具&#xff0c;而不需要繁琐的搭建环境&#xff0c;及收集工具下载安装等步骤 2、系统…...

电子技术——输出阶类型

电子技术——输出阶类型 输出阶作为放大器的最后一阶&#xff0c;其必须有较低的阻抗来保证较小的增益损失。作为放大器的最后一阶&#xff0c;输出阶需要处理大信号类型&#xff0c;因此小信号估计模型不适用于输出阶。尽管如此&#xff0c;输出阶的线性也非常重要。实际上&a…...

C++设计模式(21)——中介者模式

亦称&#xff1a; 调解人、控制器、Intermediary、Controller、Mediator 意图 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 问题 假如你有一个创建…...

Gin获取Response Body引发的OOM

有轮子尽量用轮子 &#x1f62d; &#x1f62d; &#x1f62d; &#x1f62d; &#x1f62d; &#x1f62d; 我们在开发中基于Gin开发了一个Api网关&#xff0c;但上线后发现内存会在短时间内暴涨&#xff0c;然后被OOM kill掉。具体内存走势如下图&#xff1a; 放大其中一次 在…...

不同方案特性对比

特性对比项 2.4G 蓝牙 868M WIFI 通信速率 低 低 低 高 距离&#xff08;实用可靠&#xff09; 20米 10米 30米 15米 确定性 高 低 高 高 可靠性&#xff08;距离内&#xff09; 高 低 高 高 刷新一个标签时间&#xff08;通常&#xff09; 0.5-1s …...

线性数据结构:链表 LinkList

一、前言 链表的历史 于1955-1956年&#xff0c;由兰德公司的Allen Newell、Cliff Shaw和Herbert A. Simon开发了链表&#xff0c;作为他们的信息处理语言的主要数据结构。链表的另一个早期出现是由 Hans Peter Luhn 在 1953 年 1 月编写的IBM内部备忘录建议在链式哈希表中使…...

对restful的支持 rust-grpc-proxy

目录前言快速体验说明1. 启动目标服务2. 启动代理3. 测试4. example.sh尾语前言 继上一篇博文的展望&#xff0c;这个月rust-grpc-proxy提供了对restful的简单支持。 并且提供了完成的用例&#xff0c;见地址如下&#xff0c; https://github.com/woshihaoren4/grpc-proxy/tre…...

【模拟集成电路】环路滤波器(LPF)设计

环路滤波器 LPF 设计 前言环路滤波器设计仿真结果各部分链接链接&#xff1a;前言 本文主要内容是对环路滤波器 模块设计设计进行阐述&#xff0c;LPF在电荷泵频率综合器中&#xff0c;主要作用是进行滤波&#xff0c;消除毛刺&#xff0c;因此一个简单的RC就可以起到很好的效果…...

adb及cmd部分常用命令

adb及cmd部分常用命令cmd常用命令adb常用命令内存/cpu相关此文章日常记录&#xff0c;有可能存在不准确的地方&#xff0c;仅供参考即可。 cmd常用命令 返回上一级&#xff1a; cd… 进入指定盘&#xff1a; D: 进入指定路径&#xff1a; cd 文件路径 查看子文件列表&#xf…...

ProtoBuf介绍

1 编码和解码编写网络应用程序时&#xff0c;因为数据在网络传输的都是二进制字节码数据&#xff0c;在发送数据时进行编码&#xff0c;在接受数据时进行解码codec&#xff08;编码器&#xff09;的组成部分有2个&#xff1a;decoder&#xff08;解码器&#xff09;和encoder&a…...

数据结构:完全二叉树开胃菜小练习

目录 一.前言 二.完全二叉树的重要结构特点 三.完全二叉树开胃菜小练习 1.一个重要的数学结论 2.简单的小练习 一.前言 关于树及完全二叉树的基础概念(及树结点编号规则)参见:http://t.csdn.cn/imdrahttp://t.csdn.cn/imdra 完全二叉树是一种非常重要的数据结构: n个结点的…...

mybatis与jpa

1、官方文档 mybatis&#xff1a;mybatis-spring – jpa&#xff1a;https://springdoc.cn/spring-data-jpa/ 应用文档 jpa详解_java菜鸟1的博客-CSDN博客 JPA简介及其使用详解_Tourist-xl的博客-CSDN博客_jpa的作用 2、使用比较 mybatis一般用于互联网性质的项目&#x…...

js 求解《初级算法》66. 加一

一、题目描述 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a; 输入&#xff1a…...

力扣-游戏玩法分析

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;511. 游戏玩法分析二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结…...

ZZNUOJ_用C语言编写程序实现1186 : 奖学金(结构体专题)(附完整源码)

题目描述 某校发放奖学金共5种,获取条件各不同: 1.阳明奖学金,每人8000,期末平均成绩>80,且在本学期发表论文大于等于1篇; 2.梨洲奖学金,每人4000,期末平均成绩>85,且班级评议成绩>80; 3.成绩优秀奖,每人2000,期末平均成绩>90; 4.西部奖学金,…...

加油站ai系统视频监测 yolov5

加油站ai系统视频监测通过yolov5网络模型深度学习边缘计算技术&#xff0c;加油站ai系统视频监测对现场卸油过程中人员违规离岗、现场灭火器没有按要求正确摆放、以及卸油前需要遵守静电释放15分钟、打电话、明火烟雾情况、抽烟行为进行自动识别。YOLO系列算法是一类典型的one-…...

【JDK8新特性之Stream流-Stream结果收集案例实操】

一.JDK8新特性之Stream流-Stream结果收集以及案例实操 二.Stream结果收集(collect函数)-实例实操 2.1 结果收集到集合中 /*** Stream将结果收集到集合中以及具体的实现 collect*/Testpublic void test01(){// 收集到List中 接口List<Integer> list Stream.of(1, 2, 3…...

Fiddler 抓包工具

HTTP代理所谓的http代理&#xff0c;其实就是代理客户机的http访问&#xff0c;主要代理浏览器访问页面。代理服务器是介于浏览器和web服务器之间的一台服务器&#xff0c;有了它之后&#xff0c;浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求&#xff0c;Requ…...

2023最新版网络安全保姆级指南,手把手带你从零基础进阶渗透攻防工程师

前言 一份网络攻防渗透测试的学习路线&#xff0c;不藏私了&#xff01; 1、学习编程语言(phpmysqljshtml) 原因&#xff1a; phpmysql可以帮助你快速的理解B/S架构是怎样运行的&#xff0c;只有理解了他的运行原理才能够真正的找到问题/漏洞所在。所以对于国内那些上来就说…...

排序基础之选择排序法

目录 前言 一、什么是选择排序 二、实现选择排序 三、使用泛型扩展 四、使用自定义类型测试 前言 今天天气不错&#xff0c;这么好的天气不干点啥实在是有点可惜了&#xff0c;于是乎&#xff0c;拿出键盘撸一把&#xff01; 来&#xff0c;今天来学习一下排序算法中的选…...

2.24测试用例

一.测试模型1.V模型特点:1.明确标注了测试的类型2.明确标注了测试阶段和开发阶段的对应关系缺点:测试后置2.W模型也叫双v模型,测试阶段全流程介入缺点:1.上一阶段完成.下一个阶段才能开始2.开发模型和测试模型也保持着一种线性的前后关系3.重文档,重过程,不支持敏捷模式二.设计…...