C++ 异常类型以及多级catch匹配

exceptionType是异常类型,它指明了当前的 catch 可以处理什么类型的异常;variable是一个变量,用来接收异常信息。当程序抛出异常时,会创建一份数据,这份数据包含了错误信息,程序员可以根据这些信息来判断到底出了什么问题,接下来怎么处理。

异常既然是一份数据,那么就应该有数据类型。C++ 规定,异常类型可以是 int、char、float、bool 等基本类型,也可以是指针、数组、字符串、结构体、类等聚合类型。C++ 语言本身以及标准库中的函数抛出的异常,都是 exception 类或其子类的异常。也就是说,抛出异常时,会创建一个 exception 类或其子类的对象。

exceptionType variable和函数的形参非常类似,当异常发生后,会将异常数据传递给 variable 这个变量,这和函数传参的过程类似。当然,只有跟 exceptionType 类型匹配的异常数据才会被传递给 variable,否则 catch 不会接收这份异常数据,也不会执行 catch 块中的语句。换句话说,catch 不会处理当前的异常。

我们可以将 catch 看做一个没有返回值的函数,当异常发生后 catch 会被调用,并且会接收实参(异常数据)

catch 和真正的函数调用的区别:

	真正的函数调用,形参和实参的类型必须要匹配,或者可以自动转换,否则在编译阶段就报错了。而对于 catch,异常是在运行阶段产生的,它可以是任何类型,没法提前预测,所以不能在编译阶段判断类型是否正确,只能等到程序运行后,真的抛出异常了,再将异常类型和 catch 能处理的类型进行匹配,匹配成功的话就“调用”当前的 catch,否则就忽略当前的 catch。

总起来说,catch 和真正的函数调用相比,多了一个「在运行阶段将实参和形参匹配」的过程。

另外需要注意的是,如果不希望 catch 处理异常数据,也可以将 variable 省略掉,也即写作:

try{// 可能抛出异常的语句
}catch(exceptionType){// 处理异常的语句
}

这样只会将异常类型和 catch 所能处理的类型进行匹配,不会传递异常数据了。

多级 catch

一个 try 对应一个 catch,这只是最简单的形式。其实,一个 try 后面可以跟多个 catch:

try{//可能抛出异常的语句
}catch (exception_type_1 e){//处理异常的语句
}catch (exception_type_2 e){//处理异常的语句
}
//其他的catch
catch (exception_type_n e){//处理异常的语句
}

当异常发生时,程序会按照从上到下的顺序,将异常类型和 catch 所能接收的类型逐个匹配。一旦找到类型匹配的 catch 就停止检索,并将异常交给当前的 catch 处理(其他的 catch 不会被执行)。如果最终也没有找到匹配的 catch,就只能交给系统处理,终止程序的运行。

多级 catch 的使用:

#include <iostream>
#include <string>
using namespace std;class Base{ };
class Derived: public Base{ };int main(){try{throw Derived();  //抛出自己的异常类型,实际上是创建一个Derived类型的匿名对象cout<<"This statement will not be executed."<<endl;}catch(int){cout<<"Exception type: int"<<endl;}catch(char *){cout<<"Exception type: cahr *"<<endl;}catch(Base){  //匹配成功(向上转型)cout<<"Exception type: Base"<<endl;}catch(Derived){cout<<"Exception type: Derived"<<endl;}return 0;
}

运行结果:

Exception type: Base 

在 catch 中,我们只给出了异常类型,没有给出接收异常信息的变量。
本例中,我们定义了一个基类 Base,又从 Base 派生类出了 Derived。抛出异常时,我们创建了一个 Derived 类的匿名对象,也就是说,异常的类型是 Derived。

我们期望的是,异常被catch(Derived)捕获,但是从输出结果可以看出,异常提前被catch(Base)捕获了,这说明 catch 在匹配异常类型时发生了向上转型(Upcasting)。

catch 在匹配过程中的类型转换

C/C++ 中存在多种多样的类型转换,以普通函数(非模板函数)为例,发生函数调用时,如果实参和形参的类型不是严格匹配,那么会将实参的类型进行适当的转换,以适应形参的类型,这些转换包括:

算数转换:例如 int 转换为 float,char 转换为 int,double 转换为 int 等。

向上转型:也就是派生类向基类的转换。

const 转换:也即将非 const 类型转换为 const 类型,例如将 char * 转换为 const char *。

数组或函数指针转换:如果函数形参不是引用类型,那么数组名会转换为数组指针,函数名也会转换为函数指针。

用户自定的类型转换

catch 在匹配异常类型的过程中,也会进行类型转换,但是这种转换受到了更多的限制,仅能进行「向上转型」、「const 转换」和「数组或函数指针转换」,其他的都不能应用于 catch。

const 转换以及数组和指针的转换:

#include <iostream>
using namespace std;int main(){int nums[] = {1, 2, 3};try{throw nums;cout<<"This statement will not be executed."<<endl;}catch(const int *){cout<<"Exception type: const int *"<<endl;}return 0;
}

运行结果:

Exception type: const int *

nums 本来的类型是int [3],但是 catch 中没有严格匹配的类型,所以先转换为int *,再转换为const int *。

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

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

相关文章

火狐 html5 退出 白屏,Html5+ 后退按钮出现白屏(webView.back会白屏)

您好&#xff0c;打包装到 iPad 上去调试&#xff0c;A ->B 之后&#xff0c;第一次调用 webView.back 会显示白屏&#xff0c;页面切换使用的 webView.loadUrl &#xff0c;代码如下&#xff1a;var sub plus.webview.create(_basePath pages/canlucate/canlucate.html, …

C++ throw

我们知道C 异常处理的流程&#xff0c;具体为&#xff1a; 抛出&#xff08;Throw&#xff09;--> 检测&#xff08;Try&#xff09; --> 捕获&#xff08;Catch&#xff09;异常必须显式地抛出&#xff0c;才能被检测和捕获到&#xff1b;如果没有显式的抛出&#xff0…

html移除click事件绑定,带你了解JQuery中绑定事件(bind())和移除事件(unbind())...

本文主要向大家详细介绍了jQuery的绑定事件和移除事件的使用方法和示例分享&#xff0c;这里推荐给有需要的小伙伴们参考下。有时候事件执行完了&#xff0c;想取消事件的效果可以通过一定的办法来处理。比如bind()(绑定事件)和unbind()(移除通过bind()方法添加的事件)方法来移…

html怎么设计自己的网页,求一份自己设计的简单网页 HTML格式

A&#xff1a;百格*特点&#xff1a;该仪器用于均匀划出一定规格尺寸的方格&#xff0c;通过评定方格内涂膜的完整程度来评定涂膜对基材附着程度&#xff0c;以‘级’表示。它主要用于有机涂料划格法附着力的测定&#xff0c;不仅适用于实验室&#xff0c;也可用于各种条件下的…

VC2010 项目的创建

在VC2010中创建一个项目 1 . 创建新项目。打开我们的VC2010&#xff0c;点工具栏第一个按钮&#xff08;New Project&#xff09;&#xff0c;或者菜单 File -> New -> Project…&#xff0c;或者按快捷键 CtrlShiftN&#xff0c;几种方式都可以。 2 . 在 “New Project…

html5教学案例撰写,怎样撰写教育教学案例

怎样撰写教育教学案例教学是教师的教和学生的学所组成的一种人类特有的人才培养活动。那么&#xff0c;怎样撰写教育教学案例呢?下面是小编收集整理的撰写教育教学案例的相关内容&#xff0c;希望对您有所帮助!1.撰写教育教学案例的思想准备要写好教育、教学案例&#xff0c;首…

error C2143: syntax error : missing ';' before '}'

我们在运行C程序的时候经常会遇到错误&#xff0c;如果你遇到了这个错误&#xff1a;error C2143: syntax error : missing ‘;’ before ‘}’&#xff0c;那麽我将帮你解决这个错误。 错误展示 完整代码 #include <stdio.h> #define exchange(a,b){int t; ta;ab;bt} …

绘制彩虹html代码,HTML5 Canvas 彩虹螺旋图生成器

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定$(function() {var myCanvas, context, width, height;var lines [],numberOfLines 12;var colours [#FFD800, #FF6A00, #FF0000, #0094FF, #0026FF, #4800FF, #7FFF8E, #B6FF00, #4CFF00, #FFFFFF];var Line fu…

VC2010运行C程序时黑框一闪就没

黑框一闪就没如何解决的呢&#xff1f; 首先我们要知道为什么黑框一闪就没 闪一下是因为它执行完输出函数(printf)后直接返回系统了。 解决办法 在程序里加一个system(“pause”)&#xff0c;这个是调用系统函数&#xff0c;到时候会显示"按任意键退出"。 使用方…

厦门大学计算机科学与技术学院考研分数线,2020年厦门大学计算机科学与技术考研经验分享...

原标题&#xff1a;2020年厦门大学计算机科学与技术考研经验分享大家好&#xff0c;我是育明考研小赵老师关于2020年厦门大学计算机科学与技术考研信息汇总&#xff0c;请参考一、院校介绍厦门大学(Xiamen University)&#xff0c;简称厦大(XMU)&#xff0c;是中华人民共和国教…

Redis ops详解

Redis缓存数据库的ops问题 我们使用Java操作Redis数据库的时候&#xff0c;往往会输出和ops相关的内容&#xff0c;下面给大家讲解一下ops相关的内容。 ops是什么&#xff1f; redis中的OPS 即operation per second 每秒操作次数。意味着每秒对Redis的持久化操作。 所以我们…

山东大学继续教育计算机在线作业,山东大学继续教育数文字电子技术基础习题3及答案.docx...

精品文档精品文档PAGEPAGE5精品文档PAGE..数字电子技术基础模拟卷3一填空。1逻辑代数中&#xff0c;基本的运算关系是与、或和非。2十进制数27转换成二进制数为11011&#xff1b;转换成8421BCD码是3在逻辑代数中&#xff0c;AABAB&#xff1b;A1。4同一个逻辑函数可以有不同的逻…

Spring操作Redis

在 Spring 中使用 Redis&#xff0c;除了需要 jedis.jar 外&#xff0c;还需要下载 spring-data-redis.jar&#xff0c;这里值得注意的是 jar 包和 Spring 版本兼容的问题&#xff0c;我使用的 jar 包版本是 1.8.1&#xff0c;而 Spring 的版本是 5.0.4&#xff0c;如果使用其他…

考研规划计算机科学与技术,2021考研:计算机科学与技术研究方向及冲刺复习规划...

一、研究方向20数据挖掘技术及应用21智能软件与计算理论22模式识别与图像处理23数据库理论及其应用技术24软件工程与面向对象设计&#xff0c;二、初试科目①101思想政治理论②201英语一③301数学一④408计算机学科专业基础综合三、考试内容和试卷结构数据结构、计算机组成原理…

Redis的6种数据类型

Redis 是一种基于内存的数据库&#xff0c;并且提供一定的持久化功能&#xff0c;它是一种键值&#xff08;key-value&#xff09;数据库&#xff0c;使用 key 作为索引找到当前缓存的数据&#xff0c;并且返回给程序调用者。 当前的 Redis 支持 6 种数据类型&#xff0c;它们…

华师计算机基础在线作业秋,18秋华师《计算机基础》在线作业(20210408185935).pdf...

正确答案 :( 多选题 ) 6: 微型计算机的输入设备主要有 ______ 。A: 键盘B: 鼠标C: 显示器D: 扫描仪正确答案 :( 多选题 ) 7: 以下工具软件属于数据压缩软件的有 ________ 。A: A1UB: WinZipC: RealPlayerD: WinRAR正确答案 :( 多选题 ) 8: 在 Excel 工作表中建立函数的方法有 _…

NoSQL和传统数据库的区别

Redis 等 NoSQL 工具也能够存储数据&#xff0c;有人认为 NoSQL 来会取代数据库&#xff0c;但是我不那么认为&#xff0c;我们要理解 NoSQL 和传统数据库的差异。 首先&#xff0c;NoSQL 的数据主要存储在内存中&#xff08;部分可以持久化到磁盘&#xff09;&#xff0c;而数…

内蒙古工业大学计算机科学与技术,计算机科学与技术的应用领域简述论文内蒙古工业大学.doc...

计算机科学与技术的应用领域简述论文内蒙古工业大学《计算机科学引论》课程专题报告题 目&#xff1a;计算机科学与技术的应用领域简述学生姓名: 徐铭贝学 院&#xff1a;信息工程学院系 别&#xff1a;计算机系专 业&#xff1a;计算机科学与技术班 级&#xff1a;计13-1学 号…

Redis字符串深入

字符串是 Redis 最基本的数据结构&#xff0c;它将以一个键和一个值存储于 Redis 内部&#xff0c;它犹如 Java 的 Map 结构&#xff0c;让 Redis 通过键去找到值。Redis 字符串的数据结构如下图所示。 Redis 会通过 key 去找到对应的字符串&#xff0c;比如通过 key1 找到 v…

Redis哈希数详解

Redis 中哈希结构就如同 Java 的 map 一样&#xff0c;一个对象里面有许多键值对&#xff0c;它是特别适合存储对象的&#xff0c;如果内存足够大&#xff0c;那么一个 Redis 的 hash 结构可以存储 2 的 32 次方减 1 个键值对&#xff08;40 多亿&#xff09;。 一般而言&…