重学C++系列之异常

news2024/9/22 21:00:24

一、什么是异常

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

        在某段程序发生无法继续正常执行的情况时,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++提供的。异常把功能模块代码和错误处理代码分开,使逻辑更加清晰,但是使用异常也会带来一些问题,需要注意。

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

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

相关文章

实现Feed流的三种模式:拉模式、推模式和推拉结合模式

在互联网产品中&#xff0c;Feed流是一种常见的功能&#xff0c;它可以帮助我们实时获取我们关注的用户的最新动态。Feed流的实现有多种模式&#xff0c;包括拉模式、推模式和推拉结合模式。在本文中&#xff0c;我们将详细介绍这三种模式&#xff0c;并通过Java代码示例来实现…

0801|IO进程线程day4(文件IO函数)

作业1&#xff1a;从终端获取一个文件的路径以及名字 若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹若该文件不是目录文件&#xff0c;则显示该文件的属性到终端上&#xff0c;类似ls -l这单个文件 以下代码只能跑本目录…

IDEA中修改类头的文档注释信息

IDEA中修改类头的文档注释信息 选择File--Settings--Editor--File and Code Templates--Includes&#xff0c;可以把文档注释写成这种的 /**author: Arbicoralcreate: ${YEAR}-${MONTH}-${DAY} ${TIME}Description: */这样回看就可以很清楚的看到自己创建脚本的时间&#xff…

Vue2 第十三节 使用Vue脚手架(一)

1.初始化脚手架 2.分析脚手架结构 3.修改默认配置 一.初始化脚手架 1.Vue脚手架式Vue官方提供的标准化开发工具 2.具体步骤 ① 如果下载缓慢&#xff0c;需要配置npm淘宝镜像 npm config set registry http://registry.npm.taobao.org ② 全局安装: npm install -g vu…

Jenkins配置流水线

一、新建任务 这个任务名称将会是Jenkins的workspace路径下的一个目录&#xff0c;如我建立了一个test任务&#xff0c;那么Jenkins会生成一个/jenkins_home/workspace/test目录&#xff0c;用来拉取代码编译等。所以请谨慎设置任务名称。

直线模组如何进行精度校准?

直线模组是一种高精度的传动元件&#xff0c;而精度是直线模组的重要指标&#xff0c;在直线模组的使用中&#xff0c;我们应该尽可能的避免直线模组的精度受损&#xff0c;这样才能够有真正的发挥出直线模组的稳定性。 直线模组的精度一般是指重复定位精度和导向精度&#xff…

puppeteer监听response并封装为express服务调用

const express require(express); const puppeteer require(puppeteer); const app express(); let browser; // 声明一个全局变量来存储浏览器实例app.get(/getInfo, async (req, res) > {try {const page_param req.query.page; // 获取名为"page"的查询参数…

汉王人脸考勤管理系统SQL注入RCE

忘掉&#xff01;忘掉温暖&#xff0c;忘掉温柔&#xff0c;忘掉一切享乐&#xff0c;而把饥饿、寒冷、受辱、受苦当做自己的正常生活 漏洞描述 汉王人脸考勤管理系统存在SQL注入漏洞&#xff0c;攻击者可利用该漏洞获取数据库敏感信息并Getshell。 漏洞复现 访问漏洞url&a…

MySQL多版本并发控制

1. 什么是MVCC MVCC(Multiversion Concyrrency Contril)&#xff0c;多版本并发控制。顾名思义&#xff0c;MVCC是通过数据行的多个版本来管理实现数据库的 并发控制。这项技术使得在innodb的事务隔离级别下执行 一致性读 操作有了保证。换言之&#xff0c;就是为了查询一些正在…

2023.7月最新ORACLE考试通过|微思-ORACLE官方授权中心

微思-ORACLE官方授权培训中心 2022 ORACLE OCP考试战报https://blog.csdn.net/XMWS_IT/article/details/125866726?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169089281916800182194373%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&r…

Linux系统编程 - 基础IO(IO操作)

目录 预备知识 复习C文件IO相关操作 printf相关函数 fprintf snprintf 读取文件 系统文件IO操作 open函数 umask()函数 open函数返回值 预备知识 1.你真的理解文件原理和操作了吗&#xff1f; 不是语言问题&#xff0c;是系统问题 2.是不是只有C/C有文件操作呢&…

IP地址转换函数

#include<string.h> #include<arpa/inet.h> #include<stdio.h>int main(void){char ip[]"1.2.3.4";//字符串struct sockaddr_in server_addr;inet_pton(AF_INET,ip,&server_addr.sin_addr.s_addr);//字符串 to 网络字节序printf("s_addr …

AI情绪鼓励师(基于PALM 2.0 finetune)

AI情绪鼓励师&#xff08;基于PALM 2.0 finetune) 目录 一、写在前面的话 二、前言 三、获取用于finetune的“夸夸”数据集 四、 获取并finetune PALM 2.0 预训练生成模型 模型 五、模型调用应用 一、写在前面的话 从小我就是极端内向和社恐的孩子&#xff0c;我普通之极…

面试总结-Redis篇章(十)——Redis哨兵模式、集群脑裂

Redis哨兵模式、集群脑裂 哨兵模式哨兵的作用服务状态监控 Redis集群&#xff08;哨兵模式&#xff09;脑裂解决办法 哨兵模式 为了保证Redis的高可用&#xff0c;Redis提供了哨兵模式 哨兵的作用 服务状态监控 Redis集群&#xff08;哨兵模式&#xff09;脑裂 假设由于网络原…

Java对象克隆

1.为什么要对象克隆&#xff1f; 因为直接new创建的对象&#xff0c;对象中的属性都是初始化的值&#xff0c;如果要使创建出来的对象要保存当前对象的状态&#xff0c;就要使用克隆了。 2.浅克隆 在浅克隆中&#xff0c;如果原型对象中的属性包含有引用变量&#xff0c;则将…

JSON语法

目录 一、JSON 语法规则 二、JSON 的两种结构&#xff1a; 三、JSON 名称/值对 JSON 值 JSON 数字 JSON 对象 JSON 数组 JSON 布尔值 JSON null 四、JSON 使用 JavaScript 语法 JSON 语法是 JavaScript 语法的子集。 一、JSON 语法规则 JSON 语法是 JavaScript 对象…

Java时间日期API

文章目录 java.lang.System类的方法本地日期时间&#xff1a;LocalDate、LocalTime、LocalDateTime瞬时&#xff1a;Instant日期时间格式化&#xff1a;DateTimeFormatter计算相差日期/时间&#xff1a;Period和Durationjava.util.Date(不推荐)java.text.SimpleDateFormat(不推…

设置git可以同时推送gitee和github

查看当前的远程仓库设置&#xff1a; git remote -v 这会列出你当前配置的远程仓库。你可能会看到类似以下的输出&#xff1a;origin-gitee <gitee仓库地址> (fetch)origin-gitee <gitee仓库地址> (push) 新增一个远程仓库 git remote add origin-github <githu…

PDM系统中的项目管理是什么意思?

在当今信息化时代&#xff0c;企业面对海量的产品数据和信息&#xff0c;如何高效地管理这些数据成为了关键问题。而PDM系统&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;以其强大的数据高效管理功能&#xff0c;为企业带来了诸多好处。我们以最新…

HarmonyOS 开发基础(四) 子父组件双向绑定

一、知识点在代码注释里 index.ets // 导出方式直接从文件夹 import MyInput from "../common/commons/myInput" Entry Component /* 组件可以基于struct实现&#xff0c;组件不能有继承关系&#xff0c;struct可以比class更加快速的创建和销毁。*/ struct Index {…