c++—断言、异常

news2024/12/27 17:04:10

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

     (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.coloradmin.cn/o/581598.html

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

相关文章

chatgpt赋能python:Python中Decimal模块的使用

Python中Decimal模块的使用 在Python中&#xff0c;用来处理浮点数的内置浮点数类型float&#xff0c;其精度受限于机器上的位数和操作系统的规范。当需要比float类型更高精度的计算时&#xff0c;Python提供了decimal模块。 Decimal模块的导入 from decimal import Decimal…

chatgpt赋能python:Python中的Curdir:介绍与使用

Python中的Curdir: 介绍与使用 Python中的Curdir是一个重要的概念&#xff0c;它表示当前工作目录。Curdir是操作系统中的概念&#xff0c;它在Python中也有着广泛的应用。Curdir不仅仅是一个字符串常量&#xff0c;还是一个有用的属性&#xff0c;通过它我们可以更方便地进行…

34.Mybatis-plus延续

一、Mybatis-Plus。 &#xff08;1&#xff09;ActiveRecord。 简介&#xff1a;ActiveRecord 是一种常见的设计模式之一。ActiveRecord 是一种面向对象的数据库操作模式&#xff0c;它将数据库表映射为类&#xff0c;将表中的行映射为对象。在 ActiveRecord 模式中&#xff…

LAMP安装部署

文章目录 一、LAMP平台与编译安装二、安装部署apache服务三、安装部署MySQL四、安装部署php 一、LAMP平台与编译安装 &#xff08;一&#xff09;、LAMP平台概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整台系统和相关软件&#xff0c;能够提…

第3章“程序的机器级表示”:访问信息

文章目录 3.4 访问信息3.4.1 操作数指示符3.4.2 数据传送指令3.4.3 数据传送示例 3.4 访问信息 一个 IA32 中央处理单元&#xff08;CPU&#xff09;包含一组八个存储 32 位值的寄存器&#xff0c;这些寄存器用来存储整数数据和指针。 下图显示了这八个寄存器。它们的名字都是…

Python - 批量下载ts文件并合并为mp4

&#xff08;一&#xff09;ts文件下载 网页文件下载其实都可以通过requests.get以文件流的形式获取&#xff0c;并以字节的形式写入本地文件即可。 代码如下&#xff1a; import os import requests def download(url, filenames, dirname):session requests.Session()for …

uniapp水文【uniapp】

文章目录 1、前言2、历史3、发展4、功能5、优缺点6、总结7、附录7.1、高频使用7.2、使用注意 1、前言 Uniapp是一种跨平台的移动应用开发框架&#xff0c;它允许开发者使用一套代码库&#xff0c;同时生成iOS、Android等多个平台的应用程序。这种技术方案可以大大降低开发成本…

NET框架程序设计-第1章.NET框架开发平台体系架构

1.1 .NET 框架基本组成 .NET 框架的核心便是通用语言运行时&#xff08;Commomn Language Runtime&#xff0c;简称 CLR&#xff09;&#xff0c;CLR 是一个可被各种不同的编程语言所使用的运行时。 托管模块(mangaed module)&#xff1a; 一个需要 CLR 才能执行的标准 Window…

实验 3:图形数据结构的实现与应用

东莞理工学院的同学可以借鉴&#xff0c;请勿抄袭 1.实验目的 通过实验达到&#xff1a; 理解和掌握图的基本概念、基本逻辑结构&#xff1b; 理解和掌握图的邻接矩阵存储结构、邻接链表存储结构&#xff1b; 理解和掌握图的 DFS、BFS 遍历操作的思想及其实现&#xff1b; …

威胁情报如何改进 DDoS 保护

分布式拒绝服务 (DDoS) 攻击已成为各种企业的主要威胁&#xff0c;从最小的跨国公司到最大的跨国公司。 根据 2022年全球威胁分析报告&#xff0c;恶意DDoS攻击较2021年增长了150%。此外&#xff0c;DDoS攻击的频率也出现显着上升&#xff0c;令人担忧。 在全球范围内&#x…

港大、南大、清华抢先开源「复刻」版DragGAN,开箱即用!

来源 |新智元 还记得前几天发布的DragGAN吗&#xff1f; 没错&#xff0c;就是那个「轻轻点两下」1秒修图的工具。 ▲拍的照片表情不好&#xff1f;修&#xff01;脸型不够瘦&#xff1f;修&#xff01;脸冲镜头的角度不对&#xff1f;修&#xff01; ▲搞不好&#xff0c;「让…

https 建立连接过程分析

从真实的抓包开始 根据抓包结果可以看到 从客户端发起请求开始&#xff0c;主要经过以下几个过程&#xff1a; 1、TCP 三次握手 2、浏览器发送 Client Hello 到服务器 3、服务器发送Server Hello 、证书、证书状态、服务端密钥交换&#xff0c;到浏览器 4、浏览器发送 客户端密…

【Linux】搭建SFTP文件服务器

一、协议介绍1.1 FTP 协议1.11 特点1.12 基本工作原理 1.2 SFTP协议1.21 特点1.22 基本工作原理 1.3 ssh协议1.31 特点1.32 基本工作原理 1.4 其他常见文件传输协议 二、搭建Linux的SFTP文件服务器三、连接测试3.1 电脑连接3.2 手机连接 一、协议介绍 1.1 FTP 协议 1.11 特点…

chatgpt赋能python:Python如何实现不换行

Python如何实现不换行 Python是一种高级编程语言&#xff0c;它的应用领域非常广泛&#xff0c;尤其是在数据分析、人工智能、网络爬虫等领域中拥有广泛的应用。而在Python中&#xff0c;有时候需要控制输出内容的样式&#xff0c;比如在输出时避免出现换行&#xff0c;这个需…

Bootstrap中的js插件使用

1. 标签页 1.1 init <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevic…

sqli_labs21-23

less21 这题是cookie注入&#xff0c;如果不登录进去是看不到cookie信息的&#xff0c;所以我们要先登录进去 用户admin&#xff0c;密码admin 抓包后发现cookie字段有base64编码信息&#xff0c;选中后burp自动检测翻译 既然是cookie注入并且字段是被加密了的&#xff0c;说明…

chatgpt赋能python:Python中5/2问题引发的思考

Python中5/2问题引发的思考 在Python中&#xff0c;我们常常遇到数字计算的问题&#xff0c;比如5/2。当我们在Python中执行如下代码时&#xff1a; print(5/2)输出结果为2.5。 但是在其他编程语言中&#xff0c;比如C和Java&#xff0c;同样的计算结果是2&#xff0c;而不是…

chatgpt赋能python:Pythonnumpy库下载教程:学习数据分析必备工具

Python numpy库下载教程&#xff1a;学习数据分析必备工具 介绍 Python是一种优秀的脚本语言&#xff0c;常用于数据分析、机器学习等领域&#xff0c;而Numpy是Python中最基础的科学计算库&#xff0c;提供了大量针对数组及矩阵操作的函数和方法。然而&#xff0c;对于初学者…

jQuery元素操作和尺寸位置

1. 遍历元素 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,…

Kubernetes_核心组件_kubelet_kubelet服务全解析

文章目录 前言一、查看kubelet当前运行1.1 查看kubelet当前运行1.2 kubelet配置文件1.3 kubelet启动参数文件1.4 kubelet启动全过程 (自定义启动参数文件) 二、kubelet启动过程2.1 kubelet启动过程2.2 自定义kubelet所有文件并运行步骤1&#xff1a;新建静态token文件和user&am…