C++ | 掌握C++异常处理:从基础到自定义异常体系的全面指南

news2024/11/24 19:55:04

09--异常

1、C语言传统的错误处理方式

包括终止程序和返回错误码两种方式。

直接使用assert终止程序过于粗暴:用户无意的小错误也会造成程序结束运行。

return返回错误码,再通过错误码查找错误类型:过程繁琐,对用户专业要求高。

2、C++异常概念

异常是一种错误处理机制,通过throw抛出异常,并通过trycatch进行捕获和处理。

try
    {
  // 正常业务代码(会抛出异常)
}catch( Exception e1 )
    {
  // 异常情况1
}catch( Exception e2 )
    {
  // 异常情况2
}catch( ... )
    {
  // 捕捉剩余异常
}

3、异常的使用
    • 异常的抛出和捕获遵循类型匹配原则,声明的异常类型不会隐式类型(int不会匹配double、const char* 不会匹配 string)
    • 异常对象抛出后会生成拷贝,原始对象在捕获后销毁。
    • catch(...)可以捕获任意类型的异常。
#include<iostream>
using namespace std;
double Division(double a, double b)
{
    if (b == 0)
    {
        throw "[error] b == 0";
    }
    return a / b;
}


int main()
{
    try
    {
        cout << (Division(1, 0));
    }
    catch (const char* errmsg)
    {
        cout << errmsg << endl;
    }

    return 0;
}
    • 异常的重新抛出允许异常传递给更外层的函数处理。
    • 异常安全强调在构造函数和析构函数中避免抛出异常,以防止资源泄漏。
    • 异常规范说明了函数可能抛出的异常类型。
double Division(double a, double b) throw(const char*)                                 
{                                // 异常规范 表示这个函数只会抛出的异常类型
    if (b == 0)
    {
        throw "[error] b == 0";
    }
    return a / b;
}

double Add(double a, double b) throw() 
{                            // 表明不会抛出异常 c++11后可以使用noexcept
    return a + b;
}

4、自定义继承的异常体系

异常的捕捉同样支持“多态”,捕捉基类对象的声明会同时捕捉派生类对象。

公司或项目一般都会利用此机制自定义一套异常体系,以规范异常的使用和管理。

#include<iostream>
using namespace std;
class error
{
public:
    error(const string& s)
        :_errmsg(s)
    {}
protected:
    string _errmsg;
};

class numerror :public error
{
public:
    numerror(const string& msg, int x)
        :error(msg),
        _a(x)
    {}
    friend ostream& operator<<(ostream& out, const numerror& x);
private:
    int _a;
};

ostream& operator<<(ostream& out, const numerror& x)
{
    out << x._errmsg << ' ' << x._a << endl;
    return out;
}

double Division(double a, double b) throw(error) // 异常规范 表示这个函数只会抛出的异常类型
{
    if (b == 0)
    {
        throw numerror("[error] b == 0", b);
    }
    return a / b;
}

double Add(double a, double b) throw() // 表明不会抛出异常 c++11后可以使用noexcept
{
    return a + b;
}


int main()
{
    try
    {
        cout << (Division(1, 0)) << endl;
    }
    catch (numerror errmsg)
    {
        cout << errmsg << endl;
    }
    return 0;
}

解释:

    • error 类是一个基类,用于存储错误信息。
    • numerror 类继承自 error 类,增加了一个整数成员 _a 来存储与数字相关的错误信息。
    • Division 函数声明时使用了 throw(error) 来指定函数可能抛出的异常类型。这意味着 Division 函数只会抛出 error 类或其派生类的实例。

在代码的抛出规范声明、捕捉类型声明都只需要写基类对象类型,就可以智能多态地完成捕获。

5、C++标准库的异常体系

C++提供了一系列的标准异常类,以层次结构组织。

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    try {
        vector<int> v(10, 5);
        v.reserve(10);
        // 越界抛异常:invalid vector subscript 无效的向量下标
        v.at(10) = 100;
    }
    catch (const exception& e) // 捕获基类对象即可 
    {
        cout << e.what() << endl;
    }
    catch (...)
    {
        cout << "Unkown Exception" << endl;
    }
    return 0;
}

exception是c++提供的异常类,可以将exception作为基类构建自己的异常体系。

6、异常的优缺点
    • 优点包括清晰的错误信息展示、简化深层函数错误处理、第三方库支持、适合特定函数的错误处理。
    • 缺点包括可能导致程序执行流程混乱、性能开销、资源管理问题、标准库异常体系设计不佳、使用不规范可能导致的问题。

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

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

相关文章

可视化基础的设计四大原则

一个好的数据可视化设计可以帮助观众迅速理解数据背后的意义。然而&#xff0c;如何确保我们的可视化设计既美观又简单易懂呢&#xff1f;本文将介绍四大设计原则——亲密原则、对比原则、对齐原则和重复原则。 1、 亲密原则&#xff08;Proximity&#xff09; 定义与应用&am…

学习大数据DAY34 面向对象思想深化练习 将从豆瓣爬取的数据置入自己搭建的网站上

目录 查看电影类型的电影列表 添加电影 修改电影 上机练习 13 使用三层架构完善 web 系统 查看电影类型的电影列表 DAL.py 文件 class MovieDAL(DBHelper): def getMovieByTid(self,typeid): sqlf"""select id,title,release_date,score,tname from Mo…

YOLOv8 | 融合改进 | C2f融合可变核卷积AKConv【附代码+小白可上手】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

【JavaEE】深入理解Spring IoC与DI:从传统开发到依赖注入的转变

目录 IoC & DI ⼊⻔什么是Spring什么是容器什么是IoCIoC介绍传统程序开发问题分析解决方案IoC程序开发IoC优势 IoC & DI ⼊⻔ IoC&#xff1a;Inversion of Control (控制反转) DI&#xff1a;Dependency Injection 在前⾯我们学习了Spring Boot和Spring MVC的开发, 可…

DNS相关内容

一、dns的两种解析方式 1. 正向解析 将域名解析为 ip 地址 2. 逆向解析 将 ip 地址解析为域名 设置解析方式&#xff0c;都是在 zone 文件中 named.conf 解决权限 named.rfc1912.zone 解决解析方式 3.DNS 方向解析 把 192.168.71.145 这个 ip 地址逆向解析为 www.yuany…

Android逆向题解攻防世界-easyjava-难度6

纯Java实现&#xff0c;不涉及so, flag加密之后与指定字符串 “wigwrkaugala"比较判断&#xff0c;循环一个个字符加的&#xff0c;那可以一个个字符对应还原。 加密算法就在a,b类里面&#xff0c;代码直接复制到idea &#xff0c;枚举暴力破解。 每一位输入范围a-z , 找…

Lua脚本 快速掌握

1.Lua脚本概述 Lua是一种轻量级的编程语言&#xff0c;由巴西里约热内卢天主教大学开发。设计初衷是为了嵌入应用程序中&#xff0c;提供灵活的配置和脚本能力。Lua具有简洁的语法和强大的扩展性&#xff0c;使得它在多个领域得到了广泛应用。 Lua的特点包括动态类型、自动内…

The Sandbox 游戏制作教程第 4 章|使用装备制作游戏,触发独特互动

欢迎回到我们的系列&#xff0c;我们将记录 The Sandbox Game Maker 的 “On-Equip”&#xff08;装备&#xff09;功能的多种用途。 如果你刚加入 The Sandbox&#xff0c;On-Equip 功能是 “可收集组件”&#xff08;Collectable Component&#xff09;中的一个多功能工具&a…

C++ list【常用接口、模拟实现等】

1. list的介绍及使用 1.1 list的介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2.list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前…

MyBatisPlus 第二天

常用注解 1 TableName:数据库表名和实体类名不同时,会出现以下报错 在实体类上添加 TableName("t_user") 在开发的过程中&#xff0c;我们经常遇到以上的问题&#xff0c;即实体类所对应的表都有固定的前缀&#xff0c;例如t_或tbl_此时&#xff0c;可以使用MyBa…

el-tree自定义节点内容

<el-tree :data"data" :props"defaultProps" ref"treeRef" show-checkbox check-change"handleCheckChange"><!-- 自定义节点内容 --><template #default"{ node, data, store }"><span class"tr…

无人值守人工智能智慧系统数据分析:深度洞察与未来展望

无人值守人工智能智慧系统数据分析&#xff1a;深度洞察与未来展望 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已逐渐渗透到社会经济的各个领域&#xff0c;其中无人值守人工智能智慧系统作为AI技术应用的前沿阵地&#xff0c;正引领着一场深刻的…

【数量关系】毛娃儿笔记

一、导学 1、比例的常见作用 &#xff08;1&#xff09;通过份数求数量 甲&#xff1a;乙1:2 那么甲乙的人数总和一定是3的倍数 &#xff08;2&#xff09;得到倍数关系 不同的说法都可以转化为比例&#xff0c;比如甲是乙的两倍2:1、甲是乙的4/34:3、甲比乙多25%5:4 &am…

基于vue框架的4S店汽车维修保养管理系统28a7y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;客户,技师,车辆信息,财务,客户维修,维修分配,维修订单,保养预约,保养分配,保养订单,维修费用,保养费用 开题报告内容 基于Vue框架的4S店汽车维修保养管理系统 开题报告 一、项目背景与意义 随着汽车产业的迅猛发展&#xff0c;4S店作…

【微前端中常见的问题及其解决办法】

随着前端技术的飞速发展&#xff0c;大型应用系统的复杂性和规模性日益增加&#xff0c;传统的单体前端架构逐渐暴露出维护成本高、升级困难、技术栈单一等问题。为了应对这些挑战&#xff0c;微前端&#xff08;Micro-Frontends&#xff09;作为一种新的架构模式应运而生。微前…

自研Vue3低代码海报制作平台第一步:基础拖拽组件开发

学习来源&#xff1a;稀土掘金 - 幽月之格大佬的技术专栏可拖拽、缩放、旋转组件 - 著作&#xff1a;可拖拽、缩放、旋转组件实现细节 非常感谢大佬&#xff01;受益匪浅&#xff01; 前面我们学习了很多vue3的知识&#xff0c;是时候把它们用起来做一个有意思的平台&#xf…

合合信息OCR支持30类国内常见票据一站式分类识别,支持医疗发票、数电票识别

合合信息TextIn平台明星产品——国内通用票据识别&#xff0c;重磅更新&#xff01; 产品支持票据类型扩展到23大类、30小类&#xff0c;覆盖场景更全面&#xff0c;同时升级优化了多款票据识别模型&#xff0c;平均识别率较前版本提升11.5%&#xff0c;整体识别速度提升21.9%…

关于k8s的Pod控制器

目录 1.Pod控制器及其作用 2.pod控制器类型 2.1 ReplicaSet: 2.2 Deployment 2.3 DaemonSet 2.4 StatefulSet 2.5 Job 2.6 Cronjob 3.Pod与控制器之间的关系 3.1 Deployment 3.2 SatefulSet 3.3 DaemonSet 3.4 job 3.5 cronjob 1.Pod控制器及其作用 Pod控制器&am…

北京某银行成功替换F5!更多实施细节曝光→

随着国家对金融行业技术创新的持续关注&#xff0c;金融行业的诸多用户正积极开展业务系统的数字化创新。 在这一领域&#xff0c;保障业务稳定性和连续性始终是最重要的议题。今天&#xff0c;为大家介绍的最佳实践来自北京某银行&#xff0c;他们通过积极探索和评估&#xf…

Python酷库之旅-第三方库Pandas(078)

目录 一、用法精讲 321、pandas.Series.str.len方法 321-1、语法 321-2、参数 321-3、功能 321-4、返回值 321-5、说明 321-6、用法 321-6-1、数据准备 321-6-2、代码示例 321-6-3、结果输出 322、pandas.Series.str.ljust方法 322-1、语法 322-2、参数 322-3、…