【C++】异常处理 ② ( 异常捕获类型 | 异常捕获机制 - 严格匹配异常类型 | 未知异常捕获 - 不知道异常类型 )

文章目录

  • 一、异常捕获机制 - 严格匹配异常类型
    • 1、异常捕获机制 - 严格匹配异常类型
    • 2、代码示例 - 异常捕获严格匹配异常类型
  • 二、异常捕获机制 - 未知异常捕获
    • 1、未知异常捕获 - 不知道异常类型
    • 2、代码示例 - 未知异常捕获





一、异常捕获机制 - 严格匹配异常类型




1、异常捕获机制 - 严格匹配异常类型


异常机制函数机制 是 互不干涉的两个系统 ,

  • 函数参数 的 匹配机制 是 形参 与 实参 进行匹配 ,
  • 异常捕获 的 匹配机制 是 基于 抛出的异常类型进行匹配 ;

注意 区分 异常捕获函数参数匹配 , 异常捕获 匹配的是 抛出的异常类型catch 分支中要捕获的异常类型 ;


异常捕获 , 严格按照类型进行匹配 ,

  • 如 : 在 catch 分支 中 捕获 short / int 类型的异常 , 是无法拦截到 char 类型异常的 ;

2、代码示例 - 异常捕获严格匹配异常类型


代码示例 :

#include "iostream"
using namespace std;// 1. 在 函数 中 抛出异常
void fun(int a) {if (a == 0) {// 抛出一个 char 类型的异常throw 'A';}
}int main() {// 2. 捕获并处理异常try{// 调用可能产生异常的函数fun(0);}// 抛出 char 类型的异常 , 捕获 int 类型异常是无法拦截到异常的// 此处程序会崩溃catch (int e){cout << "捕获到异常 : " << e << endl;}// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :

0x75D5D8A2 处(位于 HelloWorld.exe 中)有未经处理的异常: Microsoft C++ 异常: char,位于内存位置 0x0077F73B 处。

在这里插入图片描述





二、异常捕获机制 - 未知异常捕获




1、未知异常捕获 - 不知道异常类型


上面的案例中 , 抛出了 char 类型的异常 ‘A’ , 在 catch 分支中拦截的是 int 类型的异常 ,

也就是 没有拦截到 抛出的 char 类型异常 , 该函数是 main 函数 , 已经是最顶层的函数 ,

main 函数中 , 如果出现异常没有处理 , 应用程序直接崩溃 ;


应对该问题的方法是 , 拦截 未知异常 类型的 异常 ,

要捕获未知类型的异常 , 可以 使用 catch ( … ) 分支 , 这个catch块可以匹配任何类型的异常 , 可以拦截所有类型的异常 ,

因此无论try块中抛出什么类型的异常,都会被这个catch块捕获并处理。

使用 catch ( … ) 分支 , 可以拦截所有类型的异常 , 相当于 Java 中的 Exception 异常父类 ;


下面的代码 , 可以捕获一切类型的异常 ;

	// 捕获一切类型异常try{}catch ( ... ){cout << "捕获到未知类型异常 ... "<< endl;}

2、代码示例 - 未知异常捕获


代码示例 : 在下面的示例中 ,

  • 首先 , 使用 throw 关键字 抛出了一个 char 类型的异常 ;
  • catch (int e) 代码块中 , 可以捕获 int 类型异常 , 不能捕获 char 类型的异常 ;
  • 由于 catch 代码块 中没有明确捕获 char 类型的异常 , 该 抛出的 char 类型的异常 将被第 2 个catch ( … ) 块捕获 , 并打印相关信息 ;
#include "iostream"
using namespace std;// 1. 在 函数 中 抛出异常
void fun(int a) {if (a == 0) {// 抛出一个 char 类型的异常throw 'A';}
}int main() {// 2. 捕获并处理异常try{// 调用可能产生异常的函数fun(0);}// 抛出 char 类型的异常 , 捕获 int 类型异常是无法拦截到异常的// 此处程序会崩溃catch (int e){cout << "捕获到异常 : " << e << endl;}// 捕获一切未知类型的异常catch ( ... ){cout << "捕获到未知类型异常 ... "<< endl;}// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :

捕获到未知类型异常 ...
Press any key to continue . . .

在这里插入图片描述

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

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

相关文章

[vue3] 使用 vite 创建vue3项目的详细流程

一、vite介绍 Vite&#xff08;法语意为 “快速的”&#xff0c;发音 /vit/&#xff0c;发音同 “veet”) 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验&#xff08;热更新、打包构建速度更快&#xff09;。 二、使用vite构建项目 【学习指南】学习新技能最…

3dsMax插件Datasmith Exporter安装使用方法

3dsMax插件Datasmith Exporter安装使用方法 某些文件格式无法用Datasmith直接导入虚幻引擎&#xff0c;这些数据必须先被转换为Datasmith能够识别的文件格式。Datasmith Exporter插件就可以帮助您的软件导出可以被Datasmith导入虚幻引擎的.udatasmith格式文件。 在开始使用虚幻…

css 字体倾斜

css 字体倾斜 //左右倾斜 transform: skew(40deg, 0deg);//上下倾斜 transform: skew(0deg, 16deg);

在Rust中编写自动化测试

1.摘要 Rust中的测试函数是用来验证非测试代码是否是按照期望的方式运行的, 测试函数体通常需要执行三种操作:1.设置任何所需的数据或状态;2.运行需要测试的代码;3.断言其结果是我们所期望的。本篇文章主要探讨了Rust自动化测试的几种常见场景。 2.测试函数详解 在Rust项目工…

JUC并发编程 01——多线程基础知识

一.线程应用 异步调用 以调用方角度来讲&#xff0c;如果 需要等待结果返回&#xff0c;才能继续运行就是同步 不需要等待结果返回&#xff0c;就能继续运行就是异步 应用 比如在项目中&#xff0c;视频文件需要转换格式等操作比较费时&#xff0c;这时开一个新线程处理视…

C/C++ 实现FTP文件上传下载

FTP&#xff08;文件传输协议&#xff09;是一种用于在网络上传输文件的标准协议。它属于因特网标准化的协议族之一&#xff0c;为文件的上传、下载和文件管理提供了一种标准化的方法&#xff0c;在Windows系统中操作FTP上传下载可以使用WinINet库&#xff0c;WinINet&#xff…

卡码网语言基础课 | 17. 判断集合成员

目录 一、 set 集合 二、 创建集合 2.1 引入头文件 2.2 创建 2.3 插入元素 2.4 删除元素 三、 find的用法 四、 实现基本解题 五、 延伸拓展 题目&#xff1a;编写一个程序&#xff0c;判断给定的整数 n 是否存在于给定的集合中。 输入描述&#xff1a; 有多组测试…

单点登录平台设计

1.基本介绍 1.1什么是单点登录 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种身份认证的解决方案&#xff0c;它允许用户只需一次登录即可访问多个应用程序或系统。在一个典型的SSO系统中&#xff0c;用户只需通过一次身份认证&#xff0c;就可以…

css新闻链接案例

利用html和css构建出新闻链接案例&#xff0c;使用渐变色做出背景色变化 background: linear-gradient(to bottom, rgb(137, 210, 251), rgb(238, 248, 254), white); 利用背景图片&#xff0c;调整位置完成 dd { height: 28px; line-height: 28px; background-image: url(./图…

Linux系统编程 day07 信号

Linux系统编程 day07 信号 1. 信号的介绍以及信号的机制2. 信号相关函数2.1 signal2.2 kill2.3 abort和raise2.4 alarm2.5 setitimer 3. 信号集4. 信号捕捉函数6. SIGCHLD信号7. SIGUSR1与SIGUSR2 1. 信号的介绍以及信号的机制 信号是信息的载体&#xff0c;在Linux/Unix环境下…

JMeter从入门到精通

1、 jmeter的介绍 jmeter也是一款接口测试工具&#xff0c;由java语言开发的&#xff0c;主要进行性能测试。 2、jmeter安装 jmeter官网下载链接&#xff1a; https://jmeter.apache.org/download_jmeter.cgi &#xff0c;查看是否安装成功【jmeter -v】 下载 java jdk1.8&…

STM32 CUBEIDE Outline is disabled due to scalability mode

项目场景&#xff1a; 问题描述 Outline is disabled due to scalability mode 看不到函数 解决方案&#xff1a;