重学C++系列之异常

一、什么是异常

       异常一般是指程序运行期发生的非正常情况。异常一般是不可预测的,如:内存不足,打开文件失败,数组越界,范围溢出等。

        在某段程序发生无法继续正常执行的情况时,C++允许程序进行所谓抛出异常(有时候也称为吐出异常)的行为。

二、异常的特性

        异常从触发点开始向外传播,直到被捕获(有时候也被称为吞下异常),如果没有被捕获程序就终止。

三、怎么处理异常

        异常处理的核心思想是,把功能模块代码与系统中可能出现的错误代码分离开来,以此来达到代码组织更美观,逻辑上更清晰,并且同时从根本上来提高我们软件系统长时间稳定运行的可靠性。

// 语法简单示例:


try
{
    // 执行可能抛出异常的代码
    int fd = open("1.txt", O_RDONLY);
    if(fd == -1)
    {
        throw -1;
    }
}
catch(int i)    // 捕获整形异常
{
    cout << i << endl;
}
catch(...)    // 捕获其他异常
{
    cout << "other execption" << endl;
}

四、异常安全问题

        1、由于抛出的异常只要找到匹配的catch就直接跳到catch块执行,没有找到对应catch的函数就不会继续执行,这样会导致函数的执行流程很乱,可能会导致一些问题。

        2、构造函数完成对象的构造和初始化,最好不要在构造函数中抛出异常,否则可能会导致对象不完整或者没有完全初始化。

        3、析构函数主要完成资源的清理,最好不要在析构函数中抛出异常,否则可能导致内存泄漏。

五、案例

        1、异常最简单使用

#include <iostream>

using namespace std;

int main()
{
    // 计算两个整形数之间的除法
    cout << "please input a, b " << endl;
    int a, b;
    while(1)
    {
        cin >> a >> b;

        try
        {         
            if(b == 0)
            {
                throw -1;   // 抛出整型异常
            }
            else
            {
                cout << a << " / " << b << " = " << (float)a/b << endl;
                break;
            }
        }
        catch(int e)    // 捕获整型异常
        {
            cout << "b == 0 is illegal, please input a, b again" << endl;
            continue;
        }
    }
    cout << "sucess" << endl;



    return 0;
}

        2、异常类使用

        声明一个异常类作为基类,然后其派生类为异常的具体类型,采用多态的思想来解决捕获单个不同类型的异常。

#include <iostream>

using namespace std;


// 异常基类
class Exception
{
protected:
    string _errmsg; // 错误信息
    int _id;     // 错误码

public:
    Exception(const string &msg = string(), int id = 0)
    {
        _errmsg = msg;
        _id = id;
    }

    virtual void handle() = 0;

};

// 数据处理异常类
class DataException: public Exception
{
public:
    DataException(const string &msg = string(), int id = 1):Exception(msg, id)
    {

    }

    void handle()
    {
        cout << "DataException" << endl;
        cout << "errmsg:" << _errmsg << " id: " << _id << endl;
    }
};

// 网络异常类
class HttpException: public Exception
{
public:
    HttpException(const string &msg = string(), int id = 2):Exception(msg, id)
    {

    }

    void handle()
    {
        cout << "HttpException" << endl;
        cout << "errmsg:" << _errmsg << " id: " << _id << endl;
    }
};


int main()
{
    try
    {
        throw DataException("data is illegal", 1);
    }
    catch(Exception &e)
    {
       e.handle();
    }
    
    cout << endl;
    try
    {
        throw HttpException("network disconnect", 2);
    }
    catch(Exception &e)
    {
       e.handle();
    }

    return 0;
}

六、总结

        异常可以使用自己声明的,也可以使用C++提供的。异常把功能模块代码和错误处理代码分开,使逻辑更加清晰,但是使用异常也会带来一些问题,需要注意。

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

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

相关文章

3ds max 烘培世界坐标到贴图/顶点色

设置Diffuse 为ObjectNormal Normalize(objectNormal) * 0.5 0.5 把Diffuse烘培到顶点色 烘培Diffuse到贴图 模型按UV展开 右键复制 &#xff0c; 到mesh上粘贴 烘培到贴图 UE使用 贴图导入为BC7 float3 n ObjectNormal*2-1; return float3(n.x,n.z,n.y); // x ,z ,y

selenium官网文档阅读总结(day 2)

1.selenium元素定位方法 1.1selenium命令 当我们使用chormdriver打开网页后&#xff0c;接下来就要用python操作元素&#xff0c;模拟用户会作出的操作&#xff0c;这些操作元素的方法就是命令。比如 (1) click&#xff1a;点击&#xff08;按钮&#xff0c;单选框&#xff…

C++多线程编程(第三章 案例1,使用互斥锁+ list模拟线程通信)

主线程和子线程进行list通信&#xff0c;要用到互斥锁&#xff0c;避免同时操作 1、封装线程基类XThread控制线程启动和停止&#xff1b; 2、模拟消息服务器线程&#xff0c;接收字符串消息&#xff0c;并模拟处理&#xff1b; 3、通过Unique_lock和mutex互斥方位list 消息队列…

前端需要知道的计算机网络知识

1 Web 机制 无论通过有线方式 (通常是网线) 还是无线方式&#xff08;比如 wifi 或蓝牙)&#xff0c;通信需要进行连接&#xff0c;网络上的每台计算机需要链接到路由器&#xff08;router&#xff09;。 路由器确保从一台计算机上发出的一条信息可以到达正确的计算机。计算机…

TensorFlow项目练手(三)——基于GRU股票走势预测任务

项目介绍 项目基于GRU算法通过20天的股票序列来预测第21天的数据&#xff0c;有些项目也可以用LSTM算法&#xff0c;两者主要差别如下&#xff1a; LSTM算法&#xff1a;目前使用最多的时间序列算法&#xff0c;是一种特殊的RNN&#xff08;循环神经网络&#xff09;&#xf…

spring boot合并 http请求(前后端实现)

为什么要合并http请求 页面加载时要初始化很多资源信息&#xff0c;会发送好多http请求&#xff0c;根据http的通信握手特点&#xff0c;多个http请求比较浪费资源。进而如果能将多个http请求合并为一个发送给服务器&#xff0c;由服务器获取对应的资源返回给客户端 奇思妙解 …

Hadoop学习日记-YARN组件

YARN(Yet Another Resource Negotiator)作为一种新的Hadoop资源管理器&#xff0c;是另一种资源协调者。 YARN是一个通用的资源管理系统和调度平台&#xff0c;可为上层应用提供统一的资源管理和调度 YARN架构图 YARN3大组件&#xff1a; &#xff08;物理层面&#xff09…

C语言每日一题:12《数据结构》相交链表。

题目&#xff1a; 题目链接 思路一&#xff1a; 1.如果最后一个节点相同说明一定有交点。 2.使用两个循环获取一下长度&#xff0c;同时可以获取到尾节点。 3。注意初始化lenA和lenB为1&#xff0c;判断下一个节点是空是可以保留尾节点的。长度会少一个&#xff0c;尾节点没有…

小白到运维工程师自学之路 第六十集 (docker的概述与安装)

一、概述 1、客户&#xff08;老板&#xff09;-产品-开发-测试-运维项目周期不断延后&#xff0c;项目质量差。 随着云计算和DevOps生态圈的蓬勃发展&#xff0c;产生了大量优秀的系统和软件。软件开发人员可以自由选择各种软件应用环境。但同时带来的问题就是需要维护一个非…

【HarmonyOS】ArkTS 组件内转场动画,动画播放时颜色异常问题

【关键字】 HarmonyOS、ArkTS、组件内转场动画、颜色异常 【问题描述】 根据组件内转场动画文档中示例编写代码&#xff0c;使用动画转场组件button&#xff0c;并给button设置背景色让button透明度为0&#xff0c;实现动画转场时&#xff0c;会先出现默认蓝色button&#xf…

Ai创作系统ChatGPT源码搭建教程+附源码

系统使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到本系统&#xff01; 更新内容&#xff1a; 同步官方图片重新生成指令 同步官方 Vary 指令 单张图片对比加强 Vary(Strong) | Vary(Subtle) 同步官方 Zoom 指令 单张图片无限缩放 Zoom out 2x | Zoom out 1.5x 新增GP…

Java使用hive连接kyuubi

一、Maven依赖 <dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>2.3.9</version> </dependency> 二、相关配置信息 驱动类&#xff1a;org.apache.hive.jdbc.HiveDriver连接UR…

海外网红营销:如何利用故事打造独具魅力的品牌形象?

随着全球数字化时代的来临&#xff0c;品牌推广已经从传统的广告宣传方式逐渐转变为更加注重故事性和情感共鸣的营销手段。故事营销在品牌塑造和传播过程中发挥着重要作用&#xff0c;它能够吸引消费者的注意力&#xff0c;加深品牌与受众的情感连接&#xff0c;从而为品牌带来…

单元测试框架中测试用例的执行顺序

一、用例用例全部执行与选择执行 单元测试用例的执行顺序按照定义的用例的名称的编码大小&#xff0c;从小到大依次执行&#xff0c;因此一般通过后缀001、002...等来规划测试用例的执行顺序&#xff0c;例如&#xff1a; import unittestclass F1(unittest.TestCase):def set…

3D Tiles官方示例资源下载链接

本文列出Cesium官方提供的 3D Tiles 1.0和1.1规范的9个示例切块集&#xff08;tileset&#xff09;。 有关如何使用本地服务器托管这些示例的详细信息&#xff0c;请参阅 INSTRUCTIONS.md。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、Metadata Granularities …

【java线上监控】Arthas由菜鸟到菜鸡

目录 1 arthas介绍 1.1 简介 1.2 背景 1.3 Arthas&#xff08;阿尔萨斯&#xff09;能为你做什么&#xff1f; 2 window环境搭建 2.1 下载和启动 2.1 启动后&#xff1a;选择需要监控的服务 3 快速入门 3.1 打开浏览器 3.2 开启trace请求 3.3 查看 dashboard 3.6.…

在人间烟火里,卡萨帝开启品牌新征程

大暑刚过天正热&#xff0c;尤其是在今年厄尔尼诺现象席卷太平洋的背景下&#xff0c;人们对空调的需求持续“升温”。CCTV2财经频道《正点财经》在专题报道中提到&#xff0c;6月国内空调产销两旺&#xff0c;同比增长均在35%以上。 炙热的天气下&#xff0c;南方居民有更加难…

fiddler 手机抓包(含https) 完整流程

第一部分&#xff1a;下载并安装fiddler 一.使用任一浏览器搜索【fiddler下载安装】&#xff0c;并下载fiddler 安装包。 二.fiddler安装包下载成功后&#xff0c;将下载的fiddler压缩包解压到自定义文件夹【fiddler】或者解压到当前文件夹下&#xff0c;双击文件夹中的【fidd…

哈工大计算机网络课程局域网详解之:交换机概念

哈工大计算机网络课程局域网详解之&#xff1a;交换机概念 文章目录 哈工大计算机网络课程局域网详解之&#xff1a;交换机概念以太网交换机&#xff08;switch&#xff09;交换机&#xff1a;多端口间同时传输交换机转发表&#xff1a;交换表交换机&#xff1a;自学习交换机互…

【SCSS】网格布局中的动画

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"container">&l…