64-65 - C++中的异常处理

news/2024/5/6 5:29:31/文章来源:https://blog.csdn.net/weixin_36098975/article/details/128112299

---- 整理自狄泰软件唐佐林老师课程

1. C++异常处理

1.1 try catch内容一

  • C++内置了异常处理的语法元素 try catch
  • try语句用于处理正常代码逻辑
  • catch语句用于处理异常情况
    • try语句中的异常由对应的catch语句处理

在这里插入图片描述

1.2 C++通过throw语句抛出异常信息

在这里插入图片描述

1.3 C++异常处理分析

  • throw抛出的异常必须被 catch 处理
    • 当前函数 能够处理异常,程序继续往下执行
    • 当前函数 无法处理异常,则函数停止运行,并返回
    • 未被处理的异常 会顺着 函数调用栈 向上传播,直到被处理为止,否则程序将停止执行

在这里插入图片描述

1.4 编程实验:C++异常处理初探

#include <iostream>
#include <string>using namespace std;double divide(double a, double b)
{const double delta = 0.000000000000001;double ret = 0;if( !((-delta < b) && (b < delta)) ){ret = a / b;}else{throw 0;}return ret;
}int main(int argc, char *argv[])
{    try{double r = divide(1, 0);cout << "r = " << r << endl;}catch(...){cout << "Divided by zero..." << endl;}return 0;
}

在这里插入图片描述

1.5 try catch内容二

  • 同一个try语句 可以跟上 多个catch语句
    • catch语句可以定义 具体处理的异常类型
    • 不同类型的异常由 不同的catch语句 负责处理
    • try语句中可以抛出 任何类型 的异常
    • catch() 用于处理 所有类型的异常(只能放在最后)
    • 任何异常都 只能被捕获(catch) 一次

1.6 异常处理的匹配规则

在这里插入图片描述

  • 异常处理匹配时,不进行任何的类型转换

1.7 编程实验:异常类型匹配

#include <iostream>
#include <string>using namespace std;void Demo1()
{try{   throw 'c';}catch(char c){cout << "catch(char c)" << endl;}catch(short c){cout << "catch(short c)" << endl;}catch(double c){cout << "catch(double c)" << endl;}catch(...){cout << "catch(...)" << endl;}
}void Demo2()
{throw string("D.T.Software");
}int main(int argc, char *argv[])
{    Demo1();try{Demo2();}catch(char* s){cout << "catch(char *s)" << endl;}catch(const char* cs){cout << "catch(const char *cs)" << endl;}catch(string ss){cout << "catch(string ss)" << endl;}return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 字符串相关:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.8 catch语句块中可以抛出异常

在这里插入图片描述

  • 问题:为什么要在catch中 重新 抛出异常?
    • catch中捕获的异常可以被重新解释后抛出
    • 工程开发中使用这样的方式统一异常类型,如下:

在这里插入图片描述

1.9 实验:异常的重新解释

在这里插入图片描述

  • 直接调用第三方库中的函数,得到的异常是 -3,然后去找文档或者是代码中注释或者是分析代码,知道是超时异常,不够直观,效率较低:

在这里插入图片描述

  • 改进后:

在这里插入图片描述

#include <iostream>
#include <string>using namespace std;void Demo()
{try{try{throw 'c';}catch(int i){cout << "Inner: catch(int i)" << endl;throw i;}catch(...){cout << "Inner: catch(...)" << endl;throw;}}catch(...){cout << "Outer: catch(...)" << endl;}
}/*假设: 当前的函数式第三方库中的函数,因此,我们无法修改源代码函数名: void func(int i)抛出异常的类型: int-1 ==》 参数异常-2 ==》 运行异常-3 ==》 超时异常
*/
void func(int i)
{if( i < 0 ){throw -1;}if( i > 100 ){throw -2;}if( i == 11 ){throw -3;}cout << "Run func..." << endl;
}void MyFunc(int i)
{try{func(i);}catch(int i){switch(i){case -1:throw "Invalid Parameter";break;case -2:throw "Runtime Exception";break;case -3:throw "Timeout Exception";break;}}
}int main(int argc, char *argv[])
{// Demo();try{MyFunc(11);}catch(const char* cs){cout << "Exception Info: " << cs << endl;}return 0;
}

1.10 异常的类型可以是自定义类类型

  • 对于类类型异常的匹配依旧是至上而下严格匹配
  • 赋值兼容性原则在异常匹配中依然适用
  • 一般而言:
    • 匹配子类异常的catch放在上部
    • 匹配父类异常的catch放在下部
  • 在工程开发中会定义一系列的异常类
  • 每个类代表工程中可能出现的一种异常类型
  • 代码复用时可能需要重新解释不同的异常类
  • 在定义catch语句块时推荐使用引用作为参数

1.11 编程实验:类类型的异常

#include <iostream>
#include <string>using namespace std;class Base
{
};class Exception : public Base
{int m_id;string m_desc;
public:Exception(int id, string desc){m_id = id;m_desc = desc;}int id() const{return m_id;}string description() const{return m_desc;}
};/*假设: 当前的函数是第三方库中的函数,因此,我们无法修改源代码函数名: void func(int i)抛出异常的类型: int-1 ==》 参数异常-2 ==》 运行异常-3 ==》 超时异常
*/
void func(int i)
{if( i < 0 ){throw -1;}if( i > 100 ){throw -2;}if( i == 11 ){throw -3;}cout << "Run func..." << endl;
}void MyFunc(int i)
{try{func(i);}catch(int i){switch(i){case -1:throw Exception(-1, "Invalid Parameter");break;case -2:throw Exception(-2, "Runtime Exception");break;case -3:throw Exception(-3, "Timeout Exception");break;}}
}int main(int argc, char *argv[])
{try{MyFunc(11);}catch(const Exception& e){cout << "Exception Info: " << endl;cout << "   ID: " << e.id() << endl;cout << "   Description: " << e.description() << endl;}catch(const Base& e){cout << "catch(const Base& e)" << endl;}return 0;
}

在这里插入图片描述
在这里插入图片描述

1.12 C++标准库中提供了实用异常类族

  • 标准库中的异常都是从 exception类 派生的
  • exception类有两个主要的分支:
    • logic_error:常用语程序中的可避免逻辑错误
    • runtime_error:常用语程序中无法避免的恶性错误

1.13 标准库中的异常

在这里插入图片描述

2. 小结

  • C++中直接支持异常处理的概念
  • try catch是C++中异常处理的专用语句
  • try语句处理正常代码逻辑,catch语句处理异常情况
  • 同一个try语句可以跟上多个catch语句
  • 异常处理必须严格匹配,不尽进行任何的类型转换
  • catch语句块可以抛出异常

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

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

相关文章

测试开发之路,我在大厂做测试这四年的感悟

开篇 当开始写这篇文章时候&#xff0c;才感受到人生如白驹过隙&#xff0c;4 年时间飞逝&#xff0c;自己也从一个初入职场小白到能肩负项目核心事务的测试开发。在这里&#xff0c;总结 4 年来的心智成长之路&#xff0c;也是借机互相交流&#xff0c;并无对错之争&#xff…

pytest文档83 - 把收集的 yaml 文件转 Item 用例并运行

前言 上一篇通过用例收集钩子 pytest_collect_file 把 yaml 文件收集起来的&#xff0c;仅仅只是收集到用例&#xff0c;还不能执行。 接下来详细讲解&#xff0c;如何把yaml 文件的内容&#xff0c;转成Item 用例去执行。 pytest_collect_file 收集钩子 准备一个待执行的YA…

基于Android的学生管理系统App设计与实现(Eclipse开发)

目 录 摘 要 I Abstract II 1 绪论 1 1.1 选题背景及意义 1 1.2 研究现状 1 1.2.1 教育系统发展现状 1 1.2.2 手机的应用市场发展现状 1 1.2.3 Android平台介绍 3 1.2.4 Android管理学生信息的意义 5 1.3.3 开发的环境及开发工具介绍 6 1.3 研究主要内容 6 2 相关技术介绍 7 2.…

【生成式网络】入门篇(三):Style Transfer 的 代码和结果记录

文章目录Style Transfer 记录Fast Style Transfer 记录Style Transfer 记录 经典文章xxx&#xff0c;理论就不介绍了&#xff0c;根据一个content图像&#xff0c;和一个style图像&#xff0c;可以把style图像的style迁移到content图像上。 在代码上有一个跟之前不同的地方&am…

硬件定义软件?还是,软件定义硬件?

文章目录**1 软件和硬件****1.1 软件和硬件的定义****1.2 “硬件定义软件”和“软件定义硬件”的定义****1.3 CPU&#xff0c;软件和硬件解耦****1.4 CPU的软硬件定义****2 硬件定义软件****2.1 系统从软件逐步到硬件****2.2 硬件架构决定了软件设计****2.2.1 ASIC的硬件定义**…

django 开启CSRFtoken校验,以及postman实现问题

1.0 Django默认的CSRFtoken 表现&#xff1a; 后端使用的是Django的表单验证 post请求携带参数的问题 2.0 先处理post请求携带数据的csrfmiddlewaretoken 在登录界面 在input输入框中隐藏&#xff0c;所以需要提取input的value值&#xff0c;在【tests】脚本中进行提取&…

【C++11重点语法】lambda表达式,初始化列表

目录 引子&#xff1a;C11为什么的源来 语法1&#xff1a;初始化列表 1.2.2 多个对象的列表初始化 语法3&#xff1a;默认成员函数控制&#xff08;delete&#xff0c;default&#xff09; 语法4&#xff1a;lambda表达式 引子&#xff1a;C11为什么的源来 在2003年C标准…

简述RabbitMQ的架构设计

Broker&#xff1a; rabbitmq的服务节点Queue&#xff1a; 队列&#xff0c;是RabbitMQ的内部对象&#xff0c;⽤于存储消息。RabbitMQ中消息只能存储在队列中。⽣产者投递消息到队列&#xff0c;消费者从队列中获取消息并消费。多个消费者可以订阅同⼀个队列&#xff0c;这时队…

【Linux】shell命令行简单解释器

回顾一下&#xff0c;我们前面学习了进程创建&#xff0c;进程终止&#xff0c;进程等待&#xff0c;进程替换&#xff0c;通过这些内容我们可以来进行实现简单的shell命令行解释器&#xff01;&#xff01;&#xff01;下面我们直接来看一看如何去实现shell命令行解释器&#…

[附源码]Python计算机毕业设计SSM临港新片区招商引资项目管理系统的设计与实现(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

嫦娥五号探测器详细介绍

嫦娥五号&#xff08;Change 5&#xff09;&#xff0c;即嫦娥五号探测器&#xff0c;是由中国空间技术研究院研制的中国首个实施无人月面取样返回的航天器&#xff0c;是完成中国探月工程重大科技专项“绕、落、回”三步走发展战略最后一步的关键任务。 中国探月工程三步走 嫦…

cisco asa学习笔记

cisco asa学习笔记一、网络模拟实验中的问题调试记录1、ASA自身接口地址ping不通(从远端路由过来的主机)2、同安全级别的接口默认不能通信&#xff0c;怎么才能通信&#xff1f;3、一个asa连接3个路由器&#xff0c;互联互通解决方案<1>方案1 全局开启policy-map inspect…

算法竞赛入门【码蹄集进阶塔335题】(MT2281-2285)

算法竞赛入门【码蹄集进阶塔335题】(MT2281-2285&#xff09; 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2281-2285&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f;目录1. MT2281 另一种模2. MT2282 小码哥的认可3. MT2283 整数…

影响工业产品设计的主要因素

设计师对工业产品的产品外观设计主要依靠形状、图案和颜色的结合&#xff0c;创造出具有一定功能性质的新产品。在这个过程中&#xff0c;设计师需要充分利用各种因素&#xff0c;外观工业设计公司强调材料的机制和颜色。那么&#xff0c;影响产品设计的主要因素是什么呢? 一、…

【Linux】8.0 多线程

文章目录1.0 Linux线程概念1.1 Linux线程基本概念1.2 Linux线程优劣介绍2.0 Linux线程控制2.1 pthread_create(创建线程)2.2 pthread_join(线程等待)2.3 pthread_exit(线程终止)2.4 pthread_detach(线程分离)3.0 线程id和LWP的关系4.0 Linux线程互斥4.1 线程互斥相关概念4.2 线…

spring-boot-starter-data-redis 引发的一系列惨案

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> pom 引入jar包 &#xff0c;如果redis配置文件使用 lettuce &#xff0c;还需要引入 commons-pool2 &a…

数据可视化,销量第一的新能源汽车是什么?比亚迪新能源汽车销量接近60万辆

去年以来&#xff0c;新能源汽车火热度席卷全球&#xff0c;中国的新能源汽车无论制造或者销售&#xff0c;数量增长迅猛。下面小编用一款数据可视化软件&#xff0c;带你用可视化数据解读高端制造背后&#xff0c;中国新能源汽车的具体销售情况。同样如果你工作上有数据报表需…

固话号码认证有什么好处?固话号码认证有什么作用?

固话号码认证为企业提供号码认证服务&#xff0c;在来电时显示企业信息&#xff0c;可提高电话号码辨识度&#xff0c;防止错误标记&#xff0c;确保展现的企业信息与企业的手机终端、APP等多平台展示信息一致&#xff0c;保证品牌企业的身份及商业价值。 那如何上线号码认证服…

多点DMALL × Apache Kyuubi:构建统一SQL Proxy探索实践

伴随着国家产业升级的推进和云原生技术成熟&#xff0c;多点 DMALL 大数据技术也经历了从存算一体到存算分离的架构调整变迁。本文将从引入 Kyuubi 实现统一 SQL Proxy 的角度讲述这一探索实践的历程。 多点 DMALL 成立于2015年&#xff0c;提供一站式全渠道数字零售解决方案 D…

离线解锁 CodeCombat 全关卡教程 使用docker安装实现

背景 暂时还没收入&#xff0c;想玩顺便&#xff0c;但官方的有点贵&#xff08;是真的贵&#xff0c;扛不住&#xff09; 前期准备 下载安装docker desktop https://www.123pan.com/s/fmvUVv-HqApH&#xff0c; 这个安装不会的随便搜一个教程&#xff0c;挺多的。我随便找了一…