c++—断言、异常

一、 断言,主要用于在函数入口处进行参数检查,是否符合参数设置要求;

     (1)true:继续执行;false:终止运行;

     (2)特点:在程序运行时才能起作用,进行判断;

     (3)头文件:<cassert>

     (4)断言的代码一般放在函数或者成员函数的第一行,表达式多为函数的形参;

     (5)静态断言static_assert可以自定义违反断言时的错误提示信息,提示信息一般是一段字符串;一般很少用,因为其要求判断的表达式必须是常量,一般用配合constexpr修饰的变量(在编译器优化为常量);

#include <iostream>
#include <cassert>

using namespace std;

void func(int * ptr1, int * ptr2)
{
    assert(ptr1 && ptr2);
    cout<<(*ptr1)<<" : "<<(*ptr2)<<endl;
}

int main(int argc, char **argv)
{
    int a = 5;
    int b = 6;

    func(&a, &b);
    func(&a, nullptr);

    return 0;
}

二、 异常

    (1)异常与断言不同,异常不会立即终止程序运行;是一种面向对象语言处理错误的一种方式;

    (2)当一个函数出现自己无法处理的错误时,可以抛出异常,然后利用异常捕捉去处理;

    (3)语法,三个关键字;

        ①try:用于包含可能会出现异常的代码块或者函数,后面通常跟一个或者多个catch块;

        ②catch:用于捕捉异常;形式多样;其中catch(...)可以捕捉任意类型的异常;可以多个catch排序,异常信息会从上到下找到适配参数的catch块执行;

        ③throw:当问题出现时,throw可以抛出一个异常;

#include <iostream>
#include <cassert>
#include <string>

using namespace std;

void func(char * str1, char *str2)
{
    assert(str1 != nullptr);
    if(str2 == nullptr)
    {
        throw ("str2 is nullptr");
    }
    cout<<"ok"<<endl;
}

void pfunc(char * str1, char *str2)
{
    assert(str1 != nullptr);
    if(str2 == nullptr)
    {
        throw (777);
    }
    cout<<"ok"<<endl;
}

int main(int argc, char **argv)
{
    char name[10];
    try
    {
        func(name,nullptr);
        pfunc(name,nullptr);
    }
    catch(const char * errmsg)
    {
        cout<<errmsg<<endl;
    }
    try    //这里加一个try主要是因为当上面try内的两个函数均出现异常时,第二个异常无法显示;
    {
        pfunc(name,nullptr);
    }
    catch(int error)
    {
        cout<<"error num : "<<error<<endl;
    }

    return 0;
}

    (4)一些函数是不允许出现异常的,比如构造函数(若有异常,可能会导致对象不完整或者没有完全初始化)、析构函数(若有异常可能导致内存泄漏);

    (5)关键字noexcept

        ①主要用在一个操作或者函数不可能抛出任何异常,放在这个函数的后面;这样会给编译器更大的优化空间;

        ②使用noexcept的时机:构造函数、析构函数;

    (6)自定义异常体系,通过建立一个异常基类,派生类继承这个类,从而来定义出不同的异常;

#include <iostream>
#include <string>

using namespace std;

//基类 异常
class Exception
{
public:
    Exception(const char* str = nullptr, int id = 0) : _errmsg(str), _id(id)
    {

    }
    virtual void what()const = 0;  //纯虚函数,多态机制

protected:
   string _errmsg;//错误信息
   int _id;//错误码
};

//派生类
//数据库异常
class SqlException : public Exception
{
public:
    SqlException(const char *str = nullptr, int id = 1) : Exception(str, id)
    {

    }
    virtual void what()const
    {
        cout << "error msg:" << _errmsg << endl;
        cout << "error id:" << _id << endl;
    }
};

//网络异常
class HttpException :public Exception
{
public:
    HttpException(const char *str = nullptr, int id = 2) : Exception(str, id)
    {

    }
    virtual void what()const{
     cout << "error msg:" << _errmsg << endl;
     cout << "error id:" << _id << endl;
    }
};

//缓存异常
class CacheException :public Exception
{
public:
    CacheException(const char *str = nullptr, int id = 3) : Exception(str, id)
    {

    }
 
    virtual void what()const
    {
        cout << "error msg:" << _errmsg << endl;
        cout<< "error id:" << _id << endl;
    }
};
 
void test()
{
    //当网络连接失败,抛出这个异常即可
    //throw HttpException("Http fail", 2);
    //当缓存错误
    //throw CacheException("Cache error", 3);
    //当数据库错误
    throw SqlException("Sql error", 4);    //在抛出了一个派生类对象前,先初始化了一个类;
}

int main()
{
    try
    {
        test();
    }

    //用基类捕捉即可
    catch (const Exception& a)  //捕捉基类即可,会利用多态调用派生类的成员函数;
    {
        a.what();  //捕捉到异常后,调用该派生类对象的成员函数,将错误信息和错误代码打印;
    }

    catch (...)
    {
        cout << "unknow exception" << endl;
    }

    system("pause");

    return 0;
}

    (7)异常的优缺点

        优点:①更好的返回和描述错误信息,便于定位;②对于某些错误,不需要终止程序;

        缺点:①降低了代码可续性;②c++标准库的自定义体系不够细致,太笼统,需要我们自己定义各自的体系,造成混乱;

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

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

相关文章

【20】SCI易中期刊推荐——计算机信息系统工程电子与电气(中科院3区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

zookeeper学习笔记

zookeeper Zookeeper 入门概述Zookeeper工作机制特点数据结构应用场景统一命名服务统一配置管理统一集群管理服务器动态上下线软负载均衡 zookeeper安装本地模式安装配置参数解读 Zookeeper 集群操作集群操作集群安装 选举机制节点类型客户端命令行操作命令语法znode 节点数据信…

mysql 是否包含 返回索引 截取字符串

是否包含返回索引 原文链接&#xff1a;https://www.cnblogs.com/shoshana-kong/p/16474175.html 方法1&#xff1a;使用通配符%。 通配符也就是模糊匹配&#xff0c;可以分为前导模糊查询、后导模糊查询和全导匹配查询&#xff0c;适用于查询某个字符串中是否包含另一个模糊…

Redis的全局命令及相关误区

Redis中所说的数据结构是针对key-value中的value而言的。主要的结构包括String、哈希表、列表、集合等等在redis中存在16个库&#xff0c;涉及到后期的集群搭建只能使用0号库最为方便 查看所有键&#xff08;支持通配符&#xff09; keys * keys S*返回当前数据库中的键总数 …

智能出行更安全,亚马逊云科技携手木卫四助汽车客户安全合规出海

木卫四&#xff08;北京&#xff09;科技有限公司在汽车网络安全领域拥有独特专业知识&#xff0c;其融合人工智能算法的安全检测引擎可以不依赖车辆中安装的代理软件&#xff0c;只需几周即可快速部署实施&#xff0c;是汽车网络安全领域的技术领先者。 在亚马逊云科技初创团…

ChatGPT国内镜像站

免费国内镜像推荐&#xff08;超稳定&#xff09; 下面为大家收集了目前国内最稳定流畅的ChatGPT镜像网站 目录 机器人 博弈ai 泰cool辣 道合顺 二狗问答 核桃 WOChat GPT中文站 TomChat 利用ChatGPTMindShow三分钟生成PPT ChatGPT国内镜像是啥 ChatGPT 镜像是指…

大语言模型技术原理

在今天这个时代&#xff0c;人们的工作和生活已经离不开数据访问&#xff0c;而几乎所有平台背后的数据存储和查询都离不开数据库。SQL作为一种数据库的查询和处理语言历史悠久&#xff0c;最早由IBM于上世纪70年代初研究关系数据模型时提出&#xff0c;后续发展为一种广泛使用…

帕累托改进和帕累托最优、卡尔多-希克斯改进

根据目标个数&#xff0c;分为单目标规划&#xff0c;以及多目标规划。多目标的规划是去找折中的解集合&#xff0c;既pareto最优解集合。对优化目标超过3个以上的&#xff0c;称之为超多目标优化问题。 帕累托改进描述的就是在没有人变得不好的前提下让有些人更好的过程。帕累…

C#简单数据结构类和常用泛型结构类

文章目录 1.简单数据结构类&#xff08;1&#xff09;动态数组Arraylist&#xff08;2&#xff09;栈Stack&#xff08;3&#xff09;队列Queue&#xff08;4&#xff09;哈希表Hashtable 2.泛型3.常用泛型数据结构类&#xff08;1&#xff09;列表List&#xff08;2&#xff0…

Linux之基础IO

文章目录 前言一、再谈文件二、再谈文件操作二、如何理解文件1.文件操作的本质2.管理被打开的文件 三、进程和被打开的文件如何关联四、文件描述符fd1.引入2.理解3.分配规则 五、重定向1.引入重定向2.接口3.追加重定向4.输入重定向 总结 前言 本文介绍了系统IO、fd、重定向等内…

【Linux】在Ubuntu中卸载、下载mysql以及如何检查mysql是否卸载成功

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

micropython固件编译——把自己的py库添加进固件

目录 0. 前言1. 编写自己库的代码2. 移植库3. 验证 0. 前言 本节编译自己写的py库&#xff0c;增强移植性&#xff0c;往后烧录自己的固件即可轻易移植代码 没装好环境或者没有基础可以先看看这个&#xff1a; Ubuntu下ESP-IDF的环境搭建 Ubuntu下编译esp32micropython固件编…

windows下上架iOS应用到appstore

windows下上架iOS应用到appstore 背景步骤申请苹果开发者账号创建唯一标示符App IDs申请发布证书申请发布描述文件创建App并填写信息选择证书编译打包上传IPA到App Store提交审核 尾巴 背景 现在由于跨平台技术的兴起&#xff0c;不使用原生技术就能开发出Android和iOS应用。A…

一些关于c++的琐碎知识点

目录 bool强转 const构成重载:const修饰*p 移动构造 new int (10)所做的四件事 this指针---为什么函数里面需要this指针&#xff1f; .和->的区别 new创建对象 仿函数 new和malloc的区别 c系统自动给出的函数有 delete和delete[ ]区别何在 检查有没有析构函数 e…

BTC API:如何在比特币网络上创建应用程序?

比特币是一种去中心化的数字货币&#xff0c;可以通过比特币API与比特币网络进行交互。比特币API是一组允许开发人员与比特币网络进行交互的编程接口&#xff0c;可以帮助开发者构建各种比特币应用程序。 比特币API可以用于创建区块浏览器、钱包和比特币支付。其中利用比特币A…

Android-Activity生命周期

文章参考&#xff1a;添加链接描述 文章参考&#xff1a;添加链接描述 五大状态 StartingRunningStoppedPausedDestroyed 借用一张已经包浆的图 PS&#xff1a;Running和Paused是可视阶段&#xff0c;其余都是不可视 几大函数 onCreate&#xff1a;通过setContentLayout初始…

Markdown笔记应用程序Note Mark

什么是 Note Mark Note Mark 是一种轻量、快速、简约&#xff0c;基于网络的 Markdown 笔记应用程序。具有时尚且响应迅速的网络用户界面。 安装 在群晖上以 Docker 方式安装。 ghcr.io 镜像下载 官方的镜像没有发布在 docker hub&#xff0c;而是在 ghcr.io&#xff0c;所以…

iptables和防火墙

文章目录 1.防火墙2.Iptables基本介绍2.1 什么是iptables2.2 什么是包过滤防火墙2.3 包过滤防火墙如何实现 1.防火墙 Linux防火墙主要工作在网络层&#xff0c;针对 TCP/IP 数据包实施过滤和限制&#xff0c;典型的包过滤防火墙&#xff0c;基于内核编码实现&#xff0c;具有非…

什么是低代码开发?低代码开发可以解决哪些问题?

一、什么是低代码开发&#xff1f; 低代码可以理解为是一种全新的应用开发理念。主要以可视化、参数化的系统配置方式来进行程序应用的开发&#xff0c;因此可以大幅度减少代码编写的工作&#xff0c;从而提高开发效率。 低代码平台则是通过对于业务场景进行高度抽象、提炼&…

unittest单元测试框架

背景 unittest也称为PyUnit&#xff0c;是借鉴Java中JUnit框架产生。 unittest使我们具备创建测试用例、测试套件、测试夹具的能力。 组成 Test Fixture&#xff08;测试夹具&#xff09;&#xff1a;可以定义在单个或多个测试执行之前的准备工作和测试执行之后的清理工作。…