C++基础:异常

紧接上一篇错误,看C++如何应对这些错误问题,与现代编程语言类型,C++也提供了一种错误处理机制:异常。
异常:
为了保证检测到的错误不会被遗漏,异常处理的的基本思想是把错误检测(在被调函数中完成)和错误处理(在主调函数中完成)分离。
异常就是把各种最好的,错误处理方法,组合在一起,来处理函数检测出来错误的方法。

异常的基本思想:如果一个函数发现一个自己不能处理的错误,它不是正常返回,而抛出(throw)一个异常来表示错误的发生。任何一个直接或者简介的函数调用者都可以捕捉这一异常,并确定应该如何处理。函数可以用try语句来处理异常:把所要处理的异常情况罗列在catch语句后面。如果出现一个没有被任何调用函数处理处理的异常,程序终止运行。

参数错误:

#include"std_lib_facilities.h"class Bad_area{};/一个专门报告area()错误的类//caculate the area of a rectangle;
//throw an exception if arguments occured mistakeint area (int length, int width){if (length < 0 || width < 0) throw Bad_area();return length* width;
}int main()
try{int x = -1;int y = 2;int area1 = area(x,y);
}
catch (Bad_area) {cerr << "Oops! bad arguments to area()\n";
}

上面的错误处理是针对所有对area()的调用,如何处理错误和检测错误是分离的:main()不知道那个函数做了throw Bad_area()的动作,area()不知道那个函数会捕捉它所抛出的Bad_area异常。
在这里插入图片描述
cerr与cout的,用法相同,只是它是专门用于错误输出的。缺省的情况下,cerr和cout都输出到屏幕上。但是cerr没有优化更合适的错误信息输出,在一些操作系统中它可以被转向到其他输出目标,例如一个文件中。使用cerr也有助于我们编写与错误相关的文档。因此我们使用cerr作为错误输出。

范围错误

在ector篇中提到范围说是前闭后开的半开区间[low,high),今天我们来看利用异常的知识,看看访问最后一个地址,看是不是真的如此。

#include"std_lib_facilities.h"int main()
try{vector<int> v ;for (int x; cin >> x;) v.push_back(x);for (int i = 0; i <= v.size(); ++i)cout << "v[" << i << "] = " << v[i]<<'\n';
}catch (out_of_range){cerr << "Oops! Range error \n";return 1;
}

在这里插入图片描述看来确实如此,输入6个数字后,我们用|结束,其实只要不是int类型都可以结束。

列举一个简单的输入错误例子,用异常抛出,在catch捕捉解决 C++

#include"std_lib_facilities.h"//4---------int main()
try{double d = 0;cin >> d;if (!cin) runtime_error("couldn`t read a double in 'some_function()';");return 0;
}
catch (runtime_error err) {cerr << "Runtime error: " << err.what() << '\n';return 1;
}

在这里插入图片描述
返回到1,但是编译器没有输出我们预想的错误信息,对于runtime_error这个函数还不熟悉。

窄化错误

逻辑错误

#include"std_lib_facilities.h"//5.-------------------------------------------------------------------------------
int main()
{vector<double> temps;for (double temp; cin >> temp;)temps.push_back(temp);double sum = 0;double high_temp = 0;double low_temp = 0;for (int x: temps){if (x > high_temp)  high_temp = x;if (x < low_temp) low_temp = x;   sum += x;}cout << " The high temperature is " << high_temp << '\n';cout << " The low temperature is " << low_temp << '\n';cout << " The average temperature is " << sum / temps.size() << '\n';
}

在这里插入图片描述我们明明没有输入0,最低的温度怎么会是0呢?这个就是逻辑错误。我们在写这个代码时,初始化最低最高温度时就为0,所以这里就会有个限制,如果你输入的温度没有低于等于我们初始化最低温度low_temp=0度的,那么最低温度永远不可能正确。

在深入思考一下,如果这个初始化的温度设置为以下值,估计在没有了解这个程序的情况下很难有输出正确值。

   double high_temp = -1000;double low_temp = +1000;

那么怎么解决这个逻辑错误呢?很简单,再写一个读入,然后把这个值赋值给最高最低值,这样记录的就是我们读入的值了,而不是那个初始化的值。

#include"std_lib_facilities.h"//5.-------------------------------------------------------------------------------
int main()
{vector<double> temps;double sum = 0;double high_temp = 0;double low_temp = 0;double temp;cin >> temp;high_temp = low_temp = temp;for (temp; cin >> temp;)temps.push_back(temp);for (int x: temps){if (x > high_temp)  high_temp = x;if (x < low_temp) low_temp = x;   sum += x;}cout << " The high temperature is " << high_temp << '\n';cout << " The low temperature is " << low_temp << '\n';cout << " The average temperature is " << sum / temps.size() << '\n';}

在这里插入图片描述虽然写的有点重复,但是逻辑上正确。

下一篇我们用来这些学到的知识来调试一个简单的程序,来排除这些错误。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

「Qt Widget中文示例指南」如何实现窗口嵌入?

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文中的示例主要演…

大数据之——MapReduce代码详解(包括无敌避坑wordcount项目)

其实这一篇我有简单提到这个MapReduse的概念&#xff0c;但是只是粗略的讲解&#xff0c;可以去大致看一眼MapReduse跟HDFS、YARN的关系&#xff1a; 大数据之——Hadoop的HDFS、YARN、MapReduce_大数据hdfs-CSDN博客 &#xff08;另外注意&#xff0c;这一篇文章需要有一定ja…

浅谈人工智能之DB-GPT环境安装

浅谈人工智能之DB-GPT环境安装 简介 DB-GPT 是一个旨在将大型语言模型与数据库操作相结合的工具&#xff0c;允许用户通过自然语言与数据库进行交互。为了充分发挥 DB-GPT 的功能&#xff0c;您需要在本地或服务器上安装并配置相应的环境。本文将为您提供详细的安装步骤。本文…

032_Tiledlayout_in_Matlab中的分块图布局

贴砖多图新方式 从R2019b开始&#xff0c;MATLAB提供了新的贴砖多图方式&#xff0c;可以更加方便的绘制多个子图。 这个功能由以下函数构成&#xff1a; tiledlayoutnexttiletilenumtilerowcol tiledlayout和TiledChartLayout对象 tiledlayout函数用于创建一个贴砖布局&a…

Vue 事件阻止 e.preventDefault();click.prevent

Vue 事件阻止 Vue 事件阻止 e.preventDefault(); click.prevent修饰符

华为荣耀曲面屏手机下面空白部分设置颜色的方法

荣耀部分机型下面有一块空白区域&#xff0c;如下图红框部分 设置这部分的颜色需要在themes.xml里面设置navigationBarColor属性 <item name"android:navigationBarColor">android:color/white</item>

ELK之路第四步——整合!打通任督二脉

ELK之路第四步——整合&#xff01;打通任督二脉 前言1.架构2.下载资源3.整合开始1.分别启动三个es2.启动kibana3.新建filebeat_logstash.yml配置文件4.修改logstash的启动配置文件5.启动logstash6.启动filebeat7.Kibana查看 4.结语 前言 在开始本篇之前&#xff0c;你需要用到…

openEuler操作系统介绍

openEuler是一款开源、免费的操作系统&#xff0c;由openEuler社区运作。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据…

恋爱脑学Rust之Box与RC的对比

在遥远的某个小镇&#xff0c;住着一对年轻的恋人&#xff1a;阿丽和小明。他们的爱情故事就像 Rust 中的 Rc 和 Box 智能指针那样&#xff0c;有着各自不同的「所有权」和「共享」的理解。 故事背景 阿丽和小明准备共同养一株非常珍贵的花&#xff08;我们称之为“心之花”&…

大数据-197 数据挖掘 机器学习理论 - scikit-learn 泛化能力 交叉验证

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

数据结构-复杂度

从本期开始,我们将开始数据结构的学习&#xff0c;我会定期将我学习的内容这里上传到博客中&#xff0c;欢迎大家和我一起学习&#xff01; 一、什么是数据结构和算法 1.1 数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种…

Kubernetes中的secrets存储

华子目录 2.secrets2.1secrets功能介绍2.2secrets的创建2.2.1从文件创建2.2.2编写yaml文件 2.3secret的使用案例2.3.1将secret挂载到volume中2.3.2设置子目录映射secret密钥2.3.3将secret设置为环境变量2.3.4存储docker register的认证信息spec.imagePullSecrets[] 2.secrets …

Java已死,大模型才是未来?

作者&#xff1a;不惑_ 引言 在数字技术的浪潮中&#xff0c;编程语言始终扮演着至关重要的角色。Java&#xff0c;自1995年诞生以来&#xff0c;便以其跨平台的特性和丰富的生态系统&#xff0c;成为了全球范围内开发者们最为青睐的编程语言之一 然而&#xff0c;随着技术的…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

Java项目实战II基于Spring Boot的文理医院预约挂号系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在医疗资源日益紧张的背景下&#xff0…

Mac下载 安装MIMIC-IV 3.0数据集

参考blog MIMIC IV 3.0数据库安装方法_mimic数据下载-CSDN博客 MIMIC IV数据库安装&#xff08;二&#xff09;_mimic数据库安装-CSDN博客 MIMIC-IV3.0安装_mimic iv 3.0-CSDN博客 MIMIC-IV-v2.0安装教程_mimic iv 安装教程-CSDN博客 MIMIC IV 3.0数据库安装方法或者思路&…

[ 应急响应靶场实战 ] VMware 搭建win server 2012应急响应靶机 攻击者获取服务器权限上传恶意病毒 防守方人员应急响应并溯源

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

UI 组件的二次封装

UI 组件的二次封装是指&#xff0c;在基础 UI 库的组件上进行自定义封装&#xff0c;以实现更贴合业务需求的功能和样式。通过二次封装&#xff0c;可以增强组件的复用性、便捷性和一致性&#xff0c;简化业务代码&#xff0c;同时降低后续维护成本。 1. 二次封装的原理 二次…

Redis高级篇之缓存一致性详细教程

文章目录 0 前言1.缓存双写一致性的理解1.1 缓存按照操作来分 2. 数据库和缓存一致性的几种更新策略2.1 可以停机的情况2.2 我们讨论4种更新策略2.3 解决方案 总结 0 前言 缓存一致性问题在工作中绝对没办法回避的问题&#xff0c;比如&#xff1a;在实际开发过程中&#xff0c…

python爬虫实现自动获取论文GB 7714引用

在写中文论文、本硕博毕业设计的时候要求非常严格的引用格式——GB 7714引用。对于普通学生来说都是在google scholar上获取&#xff0c;一个一个输入点击很麻烦&#xff0c;就想使用python完成这个自动化流程&#xff0c;实现批量的倒入论文标题&#xff0c;导出引用。 正常引…