【C++】异常处理 ⑧ ( 标准异常类 | 标准异常类继承结构 | 常用的标准异常类 | 自定义异常类继承 std::exception 基类 )

文章目录

  • 一、抛出 / 捕获 多个类型异常对象
    • 1、标准异常类
    • 2、标准异常类继承结构
    • 3、常用的标准异常类
  • 二、自定义异常类继承 std::exception 基类
    • 1、自定义异常类继承 std::exception 基类
    • 2、完整代码示例 - 自定义异常类继承 std::exception 基类






一、抛出 / 捕获 多个类型异常对象




1、标准异常类


在 C++ 语言中 , 提供了一系列的 " 标准异常类 " ,

这些 " 标准异常类 " 都继承了 std::exception 基类 ,

在 标准库 中 , 抛出的异常 , 都是 标准异常类 , 都是 std::exception 类的子类 ;


2、标准异常类继承结构


标准异常类 定义在 std 命名空间 , 标准异常类 基类 std::exception 定义在 <exception> 头文件中 ;

#include <exception>

标准异常类 基类 std::exception 中提供了 what() 函数 , 用于获取异常报错信息 , what 函数的原型如下 :

namespace std {#pragma warning(push)
#pragma warning(disable: 4577) // 'noexcept' used with no exception handling mode specified
class exception
{_NODISCARD virtual char const* what() const{return _Data._What ? _Data._What : "Unknown exception";}
}

标准异常类的继承关系如下图所示 :
在这里插入图片描述

上图中 runtime_error 和 logic_error 两个重要的异常类型基类 ,

  • logic_error 是 编译时 被预先检测出来的异常 , 编程足够规范可以避免此类异常 ; logic_error 定义在了 <stdexcept> 头文件中 , 继承 exception 异常基类 ;
class logic_error : public exception { // base of all logic-error exceptions
  • runtime_error 是 运行时 不能被预先检测出的异常 ; runtime_error 定义在了 <stdexcept> 头文件中 , 继承 exception 异常基类 ;
// CLASS runtime_error
class runtime_error : public exception { // base of all runtime-error exceptions

使用标准异常类 , 使用前需要导入 <stdexcept> 头文件 ;

#include <stdexcept> 

3、常用的标准异常类


常用的标准异常类如下 : std::exception 是标准异常类 基类 , 定义了 what() 函数 , 该方法返回一个指向 C 字符串的指针 , 该字符串包含了描述异常的消息 ;

  • std::bad_alloc : 当无法分配内存时 , 会抛出此异常 ;

  • std::bad_cast : 当进行类型转换时 , 如果转换失败 , 会抛出此异常 ;

  • std::bad_exception : 当异常处理程序无法处理异常时 , 会抛出此异常 ;

  • std::logic_error : 当程序中出现逻辑错误时 , 会抛出此异常 ;

    • std::out_of_range : 当访问超出有效范围的数组元素、vector 或 string 时 , 会抛出此异常 ;
    • std::length_error : 当试图创建一个超过可表示长度的容器时 , 会抛出此异常 ;
    • std::domain_error : 当计算一个数学函数的结果时 , 如果结果不在定义域内 , 会抛出此异常 ;
    • std::invalid_argument : 当一个函数接收到无效的参数时 , 会抛出此异常 ;
  • std::runtime_error : 当程序运行时发生错误时 , 会抛出此异常 ;

    • std::overflow_error : 当整数运算结果太大 , 无法表示时 , 会抛出此异常 ;
    • std::range_error : 当数学函数的结果是无限大或 NaN 时 , 会抛出此异常 ;
    • std::underflow_error : 当数值下溢 , 即数值太小而无法表示时 , 会抛出此异常 ;
  • std::system_error : 当系统调用失败时 , 会抛出此异常 ;

  • std::system_fault : 这是一个用于指示由操作系统引起的错误的异常类 ;

  • std::bad_typeid : 当试图对一个对象使用 typeid 运算符 , 而该对象没有定义 typeid 时 , 会抛出此异常 ;

  • std::bad_weak_ptr : 当使用无效的弱指针时 , 会抛出此异常 ;

  • std::exception_ptr : 这是一个可以持有异常对象的指针类型 ;

  • std::future_error : 当 future 对象的结果未能按预期准备就绪时 , 会抛出此异常 ;

  • std::invalid_promise : 当 future 对象接收到无效的 promise 时 , 会抛出此异常 ;

  • std::lock_error : 当尝试锁定一个已经被锁定的互斥量(mutex)时 , 或者当尝试解锁一个未被锁定的互斥量时 , 会抛出此异常 ;

  • std::mutex_consistent_set : 当使用 std::set_lock_state 设置一个互斥量的状态时 , 如果该状态无效 , 会抛出此异常 ;

  • std::deadlock : 当在两个或更多的线程间产生死锁时 , 会抛出此异常 ;

  • std::unexpected : 当未捕获处理函数中抛出的异常时 , 会抛出此异常 ;





二、自定义异常类继承 std::exception 基类




1、自定义异常类继承 std::exception 基类


首先 , 导入 <stdexcept> 头文件 ;

#include <stdexcept> 

然后 , 自定义类继承 std::exception 类 , 通过构造函数设置异常信息 , 重写 what 函数 , 在该函数中返回异常信息 ;

// 自定义类实现标准异常类基类
class eSize : public exception {
public:// 构造函数设置异常信息eSize(const char* p){this->m_p = p;}// 重写 what 函数virtual const char* what() {return m_p;}// 异常信息const char* m_p;
};

再后 , 抛出异常信息 , 都抛出 eSize 类型的自定义异常类信息 , 不再像之前一样 , 抛出多个类型的异常 ;

// 1. 在 函数 中 抛出异常
void fun(int a) {// 判定数字大小, 只有 60 时是合法的// 只要传入的参数不是 60 就需要抛出不同的异常if (a == 60) {// 合法}else if (a < 0) {throw eSize("参数为负数");}else if (a == 0) {throw eSize("参数为 0");}else if (a < 60) {throw eSize("参数太小");}else if (a > 60) {throw eSize("参数太大");}
}

最后 , 捕获并处理异常 , 只需要处理 eSize& 类型的异常即可 ;

	// 2. 捕获并处理异常try{// 调用可能产生异常的函数fun(0);}catch (eSize& e){const char* what = e.what();cout << "捕获异常 : " << what << endl;}catch (...) {cout << "未知异常" << endl;}

2、完整代码示例 - 自定义异常类继承 std::exception 基类


代码示例 :

#include <iostream>
#include <stdexcept> 
using namespace std;// 自定义类实现标准异常类基类
class eSize : public exception {
public:// 构造函数设置异常信息eSize(const char* p){this->m_p = p;}// 重写 what 函数virtual const char* what() {return m_p;}// 异常信息const char* m_p;
};// 1. 在 函数 中 抛出异常
void fun(int a) {// 判定数字大小, 只有 60 时是合法的// 只要传入的参数不是 60 就需要抛出不同的异常if (a == 60) {// 合法}else if (a < 0) {throw eSize("参数为负数");}else if (a == 0) {throw eSize("参数为 0");}else if (a < 60) {throw eSize("参数太小");}else if (a > 60) {throw eSize("参数太大");}
}int main() {// 2. 捕获并处理异常try{// 调用可能产生异常的函数fun(0);}catch (eSize& e){const char* what = e.what();cout << "捕获异常 : " << what << endl;}catch (...) {cout << "未知异常" << endl;}cout << "try-catch 代码块执行完毕" << endl;// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :

捕获异常 : 参数为 0
try-catch 代码块执行完毕
Press any key to continue . . .

在这里插入图片描述

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

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

相关文章

java常用知识点记忆

类的继承与多态 类的继承不支持多重继承非private 方法才可以被覆盖覆盖的方法要求&#xff0c;子类中的方法的名字&#xff0c;参数列表&#xff0c;返回类型与父类相同方法的重载是在一个类中定义方法名字相同&#xff0c;但是参数列表不同的方法要是在子类中定义了与父类名字…

【Windows】使用SeaFile搭建本地私有云盘并结合内网穿透实现远程访问

1. 前言 现在我们身边的只能设备越来越多&#xff0c;各种智能手机、平板、智能手表和数码相机充斥身边&#xff0c;需要存储的数据也越来越大&#xff0c;一张手机拍摄的照片都可能有十多M&#xff0c;电影和视频更是按G计算。而智能设备的存储空间也用的捉襟见肘。能存储大量…

JDBC常见的几种连接池使用(C3P0、Druid、HikariCP 、DBCP)(附上代码详细讲解)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍JDBC常见的几种连接池使用&#xff08;C3P0、Druid、HikariCP 、DBCP&#xff09;以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学…

开启全新消费革命——消费增值,让每一笔消费变成财富!

你是否厌倦了仅仅购买物品或享受服务后便一无所有的消费方式&#xff1f;现在&#xff0c;消费增值的概念将彻底改变你的消费观念&#xff01;通过参与消费增值&#xff0c;你的每一笔消费都将变得更有价值&#xff01; 消费增值是一种全新的消费理念&#xff0c;它让你在购物的…

tex中的边框

文章目录 利用tcolorbox宏包给公式加框 利用tcolorbox宏包 tcolorbox可以创建一个盒子的环境&#xff0c;例如&#xff1a; \documentclass{article} \usepackage{tcolorbox} \begin{document}\begin{tcolorbox}[left1cm, right1cm, top0.5cm, bottom0.5cm,colbackblue!10!wh…

CSRF之pikachu靶场DW

1&#xff0c;登录皮卡丘靶场&#xff0c;get请求&#xff1b; 2&#xff0c;抓包并修改标记后的个人信息 最后放通一下&#xff0c;发现账号信息被修改 2&#xff0c;post请求 1提交post数据并使用bp抓包 2.利用工具改包&#xff0c;并生成url 3&#xff0c;点击提交后&#…

SpringBoot自定义异常处理机制

说明&#xff1a;在完整的项目结构中&#xff0c;我们通常会创建一个自定义的异常处理机制&#xff0c;在系统可能出现异常的地方手动抛出这些异常&#xff0c;可以快速定位到异常代码片段&#xff0c;提供项目的可维护性。 本文介绍在SpringBoot项目中&#xff0c;搭建一套自…

ssm党务政务服务热线平台源码和论文答辩PPT

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计…

任意密码重置+CRRF

一、XSS漏洞 在商城的搜索处&#xff0c;输入标准语句的传参直接就可以弹窗 二、逻辑漏洞-用户枚举 在用户注册界面&#xff0c;点击发送验证码&#xff0c;然后用BURP发包 更改手机号传参&#xff0c;这里手机号传参没有进行加密&#xff0c;直接用手机号的位置进行爆破 正确的…

LeetCode力扣每日一题(Java):9、回文数

一、题目 二、解题思路 1、我的思路 当x<0时&#xff0c;x一定不是回文数&#xff0c;直接返回false 当x>0且x<10时&#xff0c;x一定是回文数&#xff0c;直接返回true x>10时&#xff0c;先将x转为字符串。将数字转成字符串方法挺多的&#xff0c;以下是&…

06、基于内容的过滤算法Tensorflow实现

06、基于内容的过滤算法Tensorflow实现 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。全部工程可从最上方链接下载。 05、基于梯度下降的协同过滤算法中已经介绍了协同过滤算法的基本实现方法&#xff0c;但是这种方法仅…

SpringBoot集成i18n(多语言)

配置文件 spring: messages: basename: il8n/messages # 配置国际化资源文件路径 fallback-to-system-locale: true # 是否使用系统默认的语言环境作为备选项 国际化配置 import org.springframework.context.annotation.Bean; import org.spr…

MySQL-宋红康-(课P14-P15)-基本查询语句(Select)

b站视频&#xff1a; 14-最基本的SELECT...FROM结构_哔哩哔哩_bilibili 8.4 基本查询(Select)语句 数据table: emp员工表创建如下 # 员工表 CREATE TABLE EMP (EMPNO INT PRIMARY KEY, -- 员工编号ENAME VARCHAR(10), -- 员工名称JOB VARCHAR(9), -- 工…

10、SQL注入——数据库基础

文章目录 一、数据库概述二、数据库分类Mysql数据库连接方法 三、识别数据库四、SQL语法4.1 SQL基本语法4.2 高级操作 一、数据库概述 数据库&#xff08;database&#xff09;&#xff1a;存储在磁盘、磁带、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。数…

龙迅分配器LT86102UXE/LT86104UX,HDMI一分二/HDMI一分四

龙迅LT86102UXE描述; Lontium LT86102UXE HDMI2.0分配器具有1&#xff1a;2的分配器&#xff0c;符合HDMI2.0/1.4规范&#xff0c;最大6Gbps高速数据速率&#xff0c;自适应均衡RX输入和预先强调的TX输出&#xff0c;以支持长电缆应用程序&#xff0c;内部TX通道交换灵活的PCB…

部分c++11特性介绍

在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性的把两个标准合并称为C98/03标…

Day50力扣打卡

打卡记录 三个无重叠子数组的最大和 链接 滑动窗口 class Solution:def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:n, ans len(nums), []sum1 sum2 sum3 0maxsum1idx, maxsum12idx 0, ()maxsum1 maxsum12 total 0for i in range(2 * …

01 高等数学.武忠祥.0基础

第一章 函数与极限 01映射与函数 02 函数概念 对应法则 定义域 常见函数 函数的几种特性 周期函数不一定有最小周期。 涉及额外与复习 存在与任意的关系

MYSQL练题笔记-高级查询和连接-简单题3题

写了下面的前3道题。 一、每位经理的下属员工数量 看到题目就知道和之前的至少有5名下属的经理很相似&#xff0c;嘿嘿写对了就不做过多的讲解了。 二、员工的直属部门相关表和题目如下 刚开始觉得很简单&#xff0c;但是仔细想想这道题有两个输出&#xff0c;觉得想不出来&a…

C语言数组(上)

# 数组的概念 数组是一组相同类型元素的集合。数组中存放的是一个或多个数据&#xff0c;但是数组中的元素个数不能为零&#xff1b;数组中存放的所有元素&#xff08;数据&#xff09;的类型必须是相同的。 数组分为一维数组和多维数组&#xff0c;多维数组一般比较多见的是二…