C++ DAY08 异常

news2025/1/13 7:46:47

概念

异常事件(如:除 0 溢出,数组下标越界,所要读取的文件不存在 , 空指针,内存不足
等等)
C 语言对错误的处理是两种方法:
        一是使用整型的返回值标识错误;
        二是使用 errno 宏(可以简单的理解为一个全局整型变量)去记录错误。
C++ 异常不可忽略 ( 如果忽略,进程结束 )
异常作为一个类,可以拥有自己的成员,这些成员就可以传递足够的信息。
抛出异常 ----> 捕获异常。
示例:
int main(int argc, char *argv[])
{
    int num = 10 / 0;
    cout << "OVER" << endl;
    return 0;
}
//不会显示OVER,程序异常结束

抛出异常

语法:throw 值或变量;

例如:

        throw 0;
        throw 1.1;
        throw 'a';
        throw "abc";

捕获异常

语法:

try{
        可能会产生异常的代码
        111
        222 出现异常
        333
}
catch( 数据类型 1 变量名 )
{
        当throw 的值与数据类型 1 相同进入此处
}
catch( 数据类型 2 变量名 )
{
        当throw 的值与数据类型 2 相同进入此处
}
...
catch(...)
{
        当throw 的值以上数据类型都不相同进入此处
}

示例

#include <iostream>
#include <cstring>
using namespace std;
//异常步骤,抛出异常,捕获异常
int mydiv(int a,int b)
{
    if(b == 0)
    {
        // 抛出异常
        int num = 0;
        throw num;
    }
    return a / b;
}
void test01(){
    try{
        mydiv(10,0);
    }
    catch(int e)
    {
        cout << e << endl;
    }
        catch(char const* s)
    {
        cout << s << endl;
    }
        catch(...)
    {
        cout << "其他异常" << endl;
    }
}
int main(int argc, char *argv[])
{
    test01();
    return 0;
}

栈解旋

概念

        异常被抛出后,从进入 try 块起 , 到异常被抛掷前 , 这期间在栈上构造的所有对象 , 都会
被自动析构。析构的顺序与构造的顺序相反 , 这一过程称为栈的解旋

示例

class A{
private:
int num;
public:
A(int num):num(num)
{
    cout << "构造函数" << num << endl;
}
~A()
{
    cout << "析构函数" << num << endl;
}
};
void test02()
{
    A a1(1);
    A a2(2);
    throw 0;
}
int main(int argc, char *argv[])
{
    try{
        test02();
    }
    catch(...)
    {
    }
    return 0;
}

结果

         构造函数1
        构造函数2
         析构函数2
         析构函数1

异常的接口声明

作用

        限定异常抛出的类型种类

语法

        返回值类型 函数名( 形参列表 )throw( 数据类型 1, 数据类型 2,...)
        {
                函数体
        }
        注意:
                声明异常后,当前函数中只能抛出指定类型的异常
                throw():不允许抛出任何异常

示例

void fun01()throw(int,char)
{
    // throw 10;//可以
    // throw 'a';//可以
    // throw 3.14f;//不可以
}
void test03(){
    try{
        fun01();
    }
    catch(int)
    {
        cout << "int的异常" << endl;
    }
    catch(char)
    {
        cout << "char的异常" << endl;
    }
    catch(float)
    {
        cout << "float的异常" << endl;
    }
}
int main(int argc, char *argv[])
{
    test03();
    return 0;
}

异常对象的生命周期

示例1:抛出异常对象

#include <iostream>
#include <cstring>
using namespace std;
class B{
private:
    int num;
public:
    B(int num):num(num)
    {
        cout << "构造函数" << num << endl;
    }
    B(const B& b)
    {
        this->num = b.num;
        cout << "拷贝构造" << num << endl;
    }
    ~B()
    {
        cout << "析构函数" << num << endl;
    }
};
void fun02()
{
    throw B(10);
}
void test04()
{
    try
    {
        fun02();
    }
    catch(B b)
    {
    }
}
int main(int argc, char *argv[])
{
    test04();
    cout << "OVER" << endl;
    return 0;
}

结果

示例2:抛出异常对象指针

#include <iostream>
#include <cstring>
using namespace std;
class B{
private:
    int num;
public:
    B(int num):num(num)
    {
        cout << "构造函数" << num << endl;
    }
    B(const B& b)
    {
        this->num = b.num;
        cout << "拷贝构造" << num << endl;
    }
    ~B()
    {
        cout << "析构函数" << num << endl;
    }
};
void fun02()
{
    throw new B(10);
}
void test04()
{
    try{
        fun02();
    }
    catch(B *b)
    {
    }
}
int main(int argc, char *argv[])
{
    test04();
    cout << "OVER" << endl;
    return 0;
}

结果:

示例3:抛出异常对象引用

#include <iostream>
#include <cstring>
using namespace std;
class B{
private:
    int num;
public:
    B(int num):num(num)
    {
        cout << "构造函数" << num << endl;
    }
    B(const B& b)
    {
        this->num = b.num;
    cout << "拷贝构造" << num << endl;
    }
    ~B()
    {
        cout << "析构函数" << num << endl;
    }
};
void fun02()
{
    throw B(10);
}
void test04()
{
    try{
        fun02();
    }
    catch(B &b)
    {
    }
}
int main(int argc, char *argv[])
{
    test04();
    cout << "OVER" << endl;
    return 0;
}

结果:

异常的多态

概念 :   子类异常对象可以被父类异常类型捕获
示例1:
class BaseException{};
class MyException01:public BaseException{};
class MyException02:public BaseException{};
void test05()
{
    try{
        throw MyException01();
    }
    catch(BaseException)
    {
        cout << "可以捕获子类异常" << endl;
    }
}
int main(int argc, char *argv[])
{
    test05();
    return 0;
}
示例 2: 子类异常重写父类虚函数
class BaseException{
public:
    virtual void printMsg(){}
};
class NullException:public BaseException{
public:
    virtual void printMsg(){
        cout << "空指针异常" << endl;
    }
};
class ArrOutException:public BaseException{
public:
    virtual void printMsg(){
        cout << "数组下标越界异常" << endl;
    }
};
void test05()
{
    try{
        throw NullException();
    }
    catch(BaseException &e)
    {
        e.printMsg();
    }
}
int main(int argc, char *argv[])
{
    test05();
    return 0;
}

标准异常库

简介

标准库中也提供了很多的异常类,它们是通过类继承组织起来的。异常类继承层级 . 结构图
所示

标准异常使用

void test06()
{
    try{
        throw bad_alloc();
    }
    catch(exception &e)
    {
        cout << e.what() << endl;
    }
}
int main(int argc, char *argv[])
{
    test06();
    return 0;
}

自定义异常

步骤

        1,定义一个类
        2,继承与异常类
        3,重写 wait 方法

示例

class my_exception:public exception
{
private:
    char* msg;
public:
    my_exception()
    {
    }
    my_exception(char* msg)
    {
        this->msg = msg;
    }
    const char *what()const noexcept
    {
        return msg;
    }
};
void test07()
{
    try{
        throw my_exception("自定义异常");
    }
    catch(exception &e){
        cout << e.what() << endl;
    }
}
int main(int argc, char *argv[])
{
    test07();
    return 0;
}

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

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

相关文章

Day40:139.单词拆分、背包问题总结

文章目录 139.单词拆分思路代码实现 背包问题总结背包类型递推公式 139.单词拆分 题目链接 思路 确定dp数组以及下标的含义 dp[i] : 从0开始长度为i的字符串是否可以拆分为一个或多个在字典中出现的单词确定递推公式 如果确定dp[j] 是true&#xff0c;且 [j, i] 这个区间的子…

php生成xml数据

在PHP中&#xff0c;你可以使用以下几种方法生成XML数据&#xff1a; 使用DOM扩展&#xff1a; $xml new DOMDocument(1.0, UTF-8); $root $xml->createElement(root); $xml->appendChild($root); $child $xml->createElement(child); $root->appendChild($ch…

Redis(主从复制)

主从复制&#xff1a; 主从复制是指在Redis中&#xff0c;一个主节点可以将自己的数据复制到多个从节点上&#xff0c;从节点会定期从主节点同步数据&#xff0c;从而保持数据的一致性。主从复制可以实现数据的备份和容灾&#xff0c;提高系统的可用性和性能。在主从复制中&am…

Tomcat实现WebSocket即时通讯 Java实现WebSocket的两种方式

HTTP协议是“请求-响应”模式&#xff0c;浏览器必须先发请求给服务器&#xff0c;服务器才会响应该请求。即服务器不会主动发送数据给浏览器。 实时性要求高的应用&#xff0c;如在线游戏、股票实时报价和在线协同编辑等&#xff0c;浏览器需实时显示服务器的最新数据&#x…

RPG项目_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…

Django(九、cookie与session)

文章目录 一、cookie与session的介绍HTTP四大特性 cookiesession Django操作cookie三板斧基于cookie的登录功能 一、cookie与session的介绍 在讲之前我们先来回忆一下HTTP的四大特性 HTTP四大特性 1.基于请求响应 2.基于TIC、IP作用于应用层上的协议 3.无状态 保存…

Java集合拓展01

1、List&#xff0c;Set&#xff0c;Map三者的区别 List&#xff1a;一个有序&#xff08;元素存入集合的顺序和取出的顺序一致&#xff09;容器&#xff0c;元素可以重复&#xff0c;可以插入多个null元素&#xff0c;元素都有索引。常用的实现类有 ArrayList、LinkedList 和…

CSS画一条线

<p style"border: 1px solid rgba(0, 0, 0, 0.1);"></p> 效果&#xff1a;

【深度学习】不用Conda在PP飞桨Al Studio三个步骤安装永久PyTorch环境

在 PaddlePaddle AI Studio 中使用 Python 虚拟环境安装 PyTorch 免责声明 在阅读和实践本文提供的内容之前&#xff0c;请注意以下免责声明&#xff1a; 侵权问题: 本文提供的信息仅供学习参考&#xff0c;不用做任何商业用途&#xff0c;如造成侵权&#xff0c;请私信我&am…

JVM 之 class文件详解

目录 一. 前言 二. class文件结构 2.1. 文件格式 2.2. 魔数与版本号 2.3. 常量池 2.4. 访问标志 2.5. 类索引、父类索引和接口索引集合 2.6. 字段表集合 2.7. 方法表集合 2.8. 属性表集合 2.8.1. Code 属性表 2.8.2. Exceptions 属性 2.8.3. LineNumberTable 属性…

【C语言】深入理解指针(四)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

2、数仓理论概述与相关概念

1、问&#xff1a;数据仓库 建设过程中 经常会遇到那些问题&#xff1f; 模型(逻辑)重复建设 数据不一致性 维度不一致&#xff1a;命名、维度属性值、维度定义 指标不一致&#xff1a;命名、计算口径 数据不规范(字段命名、表名、分层、主题命名规范) 2、OneData数据建设核心方…

ubuntu操作系统中docker下Hadoop分布式前置环境配置实验

版本&#xff1a; centos7 hadoop 3.1.3 java JDK:1.8 集群规划&#xff1a; masterslave1slave2HDFS NameNode DataNode DataNode SecondryNameNode DataNode YARNNodeManager ResourceManage NodeManager NodeManager 1.docker容器&#xff1a; 把普通用户加入到docker组&am…

掌握 AI 和 NLP:深入研究 Python — 情感分析、NER 等

一、说明 我们见证了 BERT 等预训练模型在情感分析方面的强大功能,使我们能够破译隐藏在文本数据中的情感。通过 SpaCy,我们探索了命名实体识别的迷人世界,揭开了隐藏在非结构化文本中的秘密。 二、问题陈述 命名实体识别(NER)是自然语言处理中的一项关键…

【深度学习】脸部修复,CodeFormer,论文,实战

代码&#xff1a; https://github.com/sczhou/CodeFormer 论文&#xff1a;https://arxiv.org/abs/2206.11253 Towards Robust Blind Face Restoration with Codebook Lookup Transformer 文章目录 论文摘要1 引言2 相关工作**4 实验****4.1 数据集****4.2 实验设置和指标***…

【libGDX】使用Mesh绘制圆形

1 前言 使用Mesh绘制三角形 中介绍了绘制三角形的方法&#xff0c;使用Mesh绘制矩形 中介绍了绘制矩形的方法&#xff0c;本文将介绍绘制圆形的方法。 libGDX 以点、线段、三角形为图元&#xff0c;没有提供绘制圆形的接口。要绘制圆形边框&#xff0c;必须通过割圆法逼近圆形&…

Vue2系列 — 渲染函数 (render + createElement)

官网文档&#xff1a;https://v2.cn.vuejs.org/v2/guide/render-function.html 1 render 函数 render 函数 不使用模板&#xff0c;使用 js 生成虚拟 dom 2 createElement() 接受的参数&#xff1a; 参数1 节点类型参数2 attribute参数3 子节点 3 DEMO <template>&…

BUUCTF 梅花香之苦寒来 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 注意&#xff1a;得到的 flag 请包上 flag{} 提交 密文&#xff1a; 下载附件&#xff0c;解压得到一张.jpg图片。 解题思路&#xff1a; 1、用010 Editor看了一下&#xff0c;刚开始以为是修改宽高的题&#xff…

人工智能基础部分21-神经网络中优化器算法的详细介绍,配套详细公式

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能基础部分21-神经网络中优化器算法的详细介绍&#xff0c;配套详细公式。本文将介绍几种算法优化器&#xff0c;并展示如何使用PyTorch中的算法优化器&#xff0c;我们将使用MNIST数据集和一个简单的多层感知…

Tensorflow-gpu搭建,转载备忘

转载来自&#xff0c;所有版本号全部一致可以直接成功&#xff1a; https://blog.csdn.net/m0_38068876/article/details/128364154 https://blog.csdn.net/m0_46149071/article/details/128456089?ops_request_misc&request_id&biz_id102&utm_termtensorflow%E5%…