C++异常抛出机制:throw和try_catch

文章目录

  • 前言
  • 正文
    • 初识throw和try_catch
    • 深入(std::runtime_error和std::exception)
    • 异常处理的必要性

前言

还记得初学C++的时候,我抱着《C++ primer 5th》这本书硬啃,作为一个初学者,里面很多东西当时都很不理解,其中就包括了try_catch和throw这一块,我觉得那本书真的不适合新手入门,在一开始看到异常处理类:std::runtime_error的时候,我感觉我小脑萎缩了,因为这个东西好像前面的内容都没有提及过?看也看不懂,很是痛苦。时隔一年,终于在《C++参考手册》的帮助下搞懂了这个开发必备知识点

正文

初识throw和try_catch

首先,我们需要知道什么是throw和try_catch(异常处理机制):

try_catch是一种异常处理机制,用于捕获和处理异常。异常是在程序执行期间发生的错误或意外情况,它打断了正常的程序流程,并且可能导致程序崩溃或未定义的行为。

这里给出一段示例代码吧,我们对这段示例代码进行一个分析:

#include <iostream>
#include <stdexcept>void divideNumbers(int x, int y) {if (y == 0) {throw std::runtime_error("Error: Divide by zero!");}std::cout << "Result: " << x / y << std::endl;
}int main() {try {divideNumbers(10, 0);} catch (const std::runtime_error& ex) {std::cout << "Caught exception: " << ex.what() << std::endl;}return 0;
}

这是一段除法计算的简单代码。我们都知道:除数不能为0,因此,在这里我们就进行一个异常检测:若是检测到除数为0,就使用throw语句抛出异常。我们来看看这段程序的执行结果:

Caught exception: Error: Divide by zero!

throw语句我认为可以理解为类似于函数的返回值,虽然这么说有点不恰当,但是我还是说说我这么认为的理由:

  1. 在throw抛出异常之后,try_catch语句的执行权就发生了更改:原本是执行try中的语句,现在转为执行catch中的语句,而try中未执行的语句不再执行
  2. 抛出的异常类似于函数的返回值,catch捕获throw的抛出的异常。

通过上面这段简短的程序,我们应该已经对throw和try_catch语句有了一个初步的了解。

深入(std::runtime_error和std::exception)

在上面那段程序中我们能够发现两个我们之前未曾见过的类:std::runtime_error和std::exception,它们都在头文件stdexcept和命名空间std中。
我们先说std::runtime_error吧,从它的名字我们就能够理解它的作用:run_time_error(程序运行时出错),它是C++提供的异常类,用于:运行时抛出错误的情况下创建异常对象。std::runtime_error的构造函数接收一个参数:一个字符串或者一个C风格的数组

namespace std {class runtime_error : public exception {public:explicit runtime_error(const string& what_arg);explicit runtime_error(const char* what_arg);const char* what() const noexcept override;runtime_error(const runtime_error&) = default;runtime_error& operator=(const runtime_error&) = default;runtime_error(runtime_error&&) = default;runtime_error& operator=(runtime_error&&) = default;~runtime_error() override;};
}

这个参数用于:描述异常的错误信息。同时我们还能看到:它继承自std::exception,并重写了虚函数what(),这个函数用于返回异常的描述信息,也就是先前传入构造函数的参数。

std::runtime_error的内容就差不多讲完了,我们接下来说它的基类:std::exception,它才是异常处理类的核心。

C++提供了很多异常处理类,但是所有的异常处理类都有一个共同的基类:std::expection

namespace std {class exception {public:exception() noexcept;exception(const exception&) noexcept;exception& operator=(const exception&) noexcept;virtual ~exception();virtual const char* what() const noexcept;};
}

可以看到,相比起std::runtime_error,它的东西就很少了,它的存在主要是为了方便其他的异常处理类,而在上面的例子中,我们的catch就是将throw抛出的异常std::runtime_error捕获后“向上转型”为它的基类std::exception(“向上转型”是C++多态的一个十分重要的特性,我会在后续的文章中进行详细的说明),之后,基类调用what()函数,从而完成了对异常的打印操作。

异常处理的必要性

在大型程序中,我们往往不能够及时发现程序的bug在哪,但是我们可以大概感觉到哪里可能出问题,因此我们就能够使用throw和try_catch在程序运行时对异常进行处理。这样做不仅能够帮助我们找到异常出现的原因,同时不会影响程序的正常运行

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

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

相关文章

Docke自学笔记

概述 docker是什么呢&#xff1f;就是容器呀&#xff0c;像你用的Tomcat一样都是容器&#xff0c;只不过&#xff0c;docker可以用极少的资源来运行&#xff0c;极大的利用计算资源&#xff0c;不像你要隔离应用一样需要启用虚拟机&#xff0c;你的应用是部署在虚拟机上&#…

分割算法-大津算法

分割算法-大津算法 一、什么是大津算法二、算法原理三、公式推导四、代码五、算法适用性 大津算法介绍以及C函数代码实现。 一、什么是大津算法 大津算法&#xff08;Otsu&#xff09;由日本学者大津展之在1979年提出&#xff0c;又称最大类间方差法。此法求得的阈值&#xff…

智能井盖传感器怎么安装?井盖传感器介绍

一提到井盖相信大伙都不陌生。无论是城市的繁华商业街&#xff0c;还是乡村的宁静马路&#xff0c;随处都可以看到它的身影。它可能看起来普普通通&#xff0c;但却是城市基础设施中不可或缺的一部分。随着科学技术的发展对井盖的管理也越来越智能化&#xff0c;如多个地区纷纷…

【Quasar】暗黑主题随系统切换部分组件无法随系统切换

问题描述 Quasar部分组件无法随系统切换主题 。 假如系统、Quasar主题为白天模式。Quasar设置主题随系统切换&#xff0c;当系统切换暗黑模式时&#xff0c;Quasar导航栏无法正常切换为暗黑模式&#xff0c;此时背景还是白天模式&#xff0c;如图 正常切换参考图 正常暗黑…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《计及管网选型与潮流约束的区域综合能源系统分期协同规划》

这个标题涉及到区域综合能源系统的规划&#xff0c;其中考虑了两个关键因素&#xff1a;管网选型和潮流约束。下面对标题中的关键术语进行解读&#xff1a; 区域综合能源系统&#xff1a; 这指的是一个综合考虑多种能源形式&#xff08;比如电力、热能、气体等&#xff09;的系…

挑选数据可视化工具:图表类型、交互功能与数据安全

作为一名数据分析师&#xff0c;我经常需要使用各种数据可视化工具来将数据以直观、清晰的方式呈现出来&#xff0c;以便更好地理解和分析。在市面上的众多可视化工具中&#xff0c;我根据实际需求和项目特点进行选择。本文将从以下几个角度对市面上的数据可视化工具进行对比&a…

Python高级数据结构——B树和B+树

Python中的B树和B树&#xff1a;高级数据结构解析 B树和B树是一种多叉树&#xff0c;常用于处理大量数据的存储和检索操作。它们广泛应用于文件系统、数据库索引等领域&#xff0c;具有高效的插入、删除和搜索性能。在本文中&#xff0c;我们将深入讲解Python中的B树和B树&…

C++类和对象——(8)类的组合

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;想保持平衡…

PHP入门软件Wampserver与vscode

PHP入门软件Wampserver与vscode Wampserver 一个集成的PHP环境&#xff0c;非常好用&#xff0c;上链接官网&#xff1a;https://www.wampserver.com/#download-wrapper 推荐华军https://www.onlinedown.net/soft/82112.htm 无脑下一步就行&#xff0c;会出现两个弹窗全点否。…

OMSA无法打开无法显示等服务异常时如何处理

文章目录 为何需要重启OMSAWindows 重启OMSA服务Linux 重启OMSA服务VMware 环境重启OMSA服务重启无效的解决办法推荐阅读 为何需要重启OMSA 在安装 OMSA 的服务器中&#xff0c;OMSA 管理软件运行可能会不稳定。例如&#xff1a; 某些信息&#xff08;如存储信息&#xff09;…

Redis quicklist源码+listpack源码(6.0+以上版本)

ziplist设计上的问题&#xff0c;每一次增删改都需要计算前面元素的空间和长度&#xff08;prevlen&#xff09;&#xff0c;这种设计缺陷非常明显&#xff0c;一旦其中一个entry发生修改&#xff0c;以这个entry后面开始&#xff0c;全部需要重新计算prevlen&#xff0c;因此诞…

nodejs+vue+微信小程序+python+PHP新闻发布系统的设计与实现-计算机毕业设计推荐

根据现实需要&#xff0c;此系统我们设计出一下功能&#xff0c;主要有以下功能模板。 &#xff08;1&#xff09;新闻发布系统前台&#xff1a;首页、时事新闻、公告资讯、个人中心。 &#xff08;2&#xff09;管理员功能&#xff1a;首页、个人中心、用户管理、新闻分类管理…

Open3D 进阶(19)间接平差法拟合平面

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 见:PCL 间接平差法拟合平面 二、代码实现 import numpy as np import open3d

24:kotlin 类和对象 -- 对象表达式和声明(Object expressions and declarations)

如果需要创建一个稍微修改了某个类的对象&#xff0c;而不需要显式地声明一个新的子类。Kotlin可以通过对象表达式&#xff08;object expressions&#xff09;和对象声明&#xff08;object declarations&#xff09;来处理这种情况。 对象表达式 对象表达式用于创建匿名类的…

中国移动频段划分

1、900MHz&#xff08;Band8&#xff09;上行&#xff1a;889-904MHz&#xff0c;下行&#xff1a;934-949MHz&#xff0c;带宽共计15MHz&#xff0c;目前部署&#xff1a;2G/NB-IoT/4G 2、1800MHz&#xff08;Band3&#xff09;上行&#xff1a;1710-1735MHz&#xff0c;下行…

kyuubi整合flink yarn application model

目录 概述配置flink 配置kyuubi 配置kyuubi-defaults.confkyuubi-env.shhive 验证启动kyuubibeeline 连接使用hive catalogsql测试 结束 概述 flink 版本 1.17.1、kyuubi 1.8.0、hive 3.1.3、paimon 0.5 整合过程中&#xff0c;需要注意对应的版本。 注意以上版本 姊妹篇 k…

机器学习之蛙跳算法(Jumping Frog Optimization,JFO)

概念 蛙跳算法(Jumping Frog Optimization,JFO)是一种基于仿生学和自然界觅食行为的启发式优化算法。该算法模拟了青蛙在寻找食物时的跳跃行为。青蛙通过一系列跳跃来寻找最优位置,而这些跳跃的长度和方向是通过计算当前位置的适应度值来确定的。 蛙跳算法的基本步骤: …

AXURE地图获取方法

AXURE地图截取地址 https://axhub.im/maps/ 1、点击上方地图或筛选所需地区的地图&#xff0c;点击复制到 Axure 按钮&#xff0c;到 Axure 粘贴就可以了 2、复制到 Axure 后&#xff0c;转化为 svg 图形&#xff0c;就可以随意更改尺寸/颜色/边框&#xff0c;具体操作如下&am…

微型5G网关如何满足智能巡检机器人应用

在规模庞大、设施复杂的炼化厂、钢铁厂、工业园区等大型、巨型区域&#xff0c;时刻需要对各类设施设备巡查监测&#xff0c;保障生产运行安全可控。传统的人工巡检存在着心态松懈、工作低效、工作强度高、工作环境恶劣等问题&#xff0c;仍然存在安全隐患。 而随着物联网、5G、…

【Flink on k8s】- 6 - Flink 核心特性

目录 1、系统架构 1.1 Flink api 抽象 1.2 数据流图 1.1.1、流式计算引擎逻辑视角与物理视角