15.异常处理

2023-05-16

目录

  • 1.为什么需要异常处理?
  • 2.在c++ 中异常处理的方法??
  • 3.异常的抛出
  • 4.异常的类型捕捉
  • 5.系统预定义的异常类型
  • 6.异常的再抛出

1.为什么需要异常处理?

  1. 用 new 运算符动态分配空间时,空间不够导致无法分配;
  2. 访问数组元素时,下标越界;打开文件读取时,文件不存在。
  3. 访问了野指,出现内存错误等等 …

2.在c++ 中异常处理的方法??

利用try (测试)   throw(抛出异常) catch(处理异常)
  1. 在c 语言 中异常处理的方法??
    ​ 利用 if 语句判断操作是否正确。

  2. c/c++ 中异常处理的区别:
    ​ c++ 中的处理能力更强,逻辑性更严谨,且系统中某些函数已经预定义了异常的抛出。如at,new 等等…

  3. 语法:

    try {
        用户需要执行的代码
    }
    catch(异常类型) {
        异常处理代码
    }
    ...
    catch(异常类型) {
        异常处理代码
    }
    
  4. 例子:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        try{
           int *p =  new int[0x0fffffffffffffff];  //系统自动抛出异常
        }
        catch(...)  //接收异常
        {
                cout  << "程序出现异常"  << endl;
        }
    }
    
    

3.异常的抛出

当系统不会自动抛出异常时,用户就要手动抛出异常。

 string a="hello"; 
    try{
     cout << a.at(1000000)  << endl;  //带有自动抛出异常的功能
    }catch(...)
    {
         cout << "代码出现异常" << endl;
    }

    try{

        cout << a[1000000] << endl;  //不具有自动抛出异常
    }catch(...){
        cout << "代码异常2" << endl;
    }

抛出异常语法:

throw  表达式;

例子:

#include <iostream>
using namespace std;

int main()
{
    string a="hello"; 
    try{
     cout << a.at(1000000)  << endl;  //带有自动抛出异常的功能
    }catch(...)
    {
         cout << "代码出现异常" << endl;
    }

    try{
        int size=1000000;
        if(size >= 5)  //手动  抛出异常
        {
                throw "数组越界";
        }
        cout << a[size] << endl;  //不具有自动抛出异常
        
    }catch(...){
        cout << "代码异常2" << endl;
    }
}

4.异常的类型捕捉

catch(…) : 可以捕捉任何的异常类型,拿不到异常的抛出数据

#include <iostream>
using namespace std;

class base
{
    
};

int main()
{
    base a;

    try{
            //直接抛出异常 
            throw  a;
    }
    catch(int a)  //捕捉  抛出的整形的异常
    {
        cout <<  "int"<<a << endl;
    }
    catch(double a)//捕捉  抛出的浮点型的异常
    {
        cout <<"double"<< a << endl;
    }
    catch(const char *a)//捕捉  抛出的字符串类型异常
    {
        cout << "char *"<<a << endl;
    }
    catch(...)
    {
        cout << "其他异常" << endl;
    }

}

5.系统预定义的异常类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GfuoNTnI-1648897239255)(笔记.assets/image-20210429102411957.png)]

 catch(exception &e)  //利预定义异常类型可以,告诉用户异常原因
 {
 	cout << "其他异常"  << e.what() << endl;
 }

6.异常的再抛出

当一个函数出现异常的时候,抛出异常并,处理的的话,这个异常会继续往上抛出,直到处理为之!!

#include <iostream>

using namespace std;

//test 自己抛出自己处理
void test()
{
    try{
          throw "抛出异常";
    }
    catch(const char *a){   //在这里已经把异常处理掉了 
            cout << "输出异常:"  << a << endl;
    }
}

void test0()  //出现了异常,未处理 
{
    throw "抛出异常";  //只在当前函数中抛出不处理
}

void test1() //把异常抛出到 test1中  ,未处理
{
      cout << "test1" << endl; 
      test0();   
      cout <<  "test endl"  << endl;
}

int main() //继续把异常抛出到 main 中,catch已经处理
{
        try{
           // test(); //执行test 函数 
            test1();
        }
        catch(...){
            cout << "出现异常并未处理" << endl;
        }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

15.异常处理 的相关文章

随机推荐

  • ESP32四轴飞控硬件设计

    一 前言 目前许多入门级开源飞控都是基于STM32系列的 xff0c 基于此系列的有非常严重的短板 xff0c 例如说通信方面 xff0c 需要外置通信模块 ESP32本身带有WIFI和蓝牙 xff0c 在通信方面有着一定的优势 xff0c
  • C++弹窗拦截程序,弹窗广告怎么关闭?不用问,我教你怎么屏蔽!

    现在大家使用电脑的频率越来越高 xff0c 上课写作业 上班做工作 娱乐生活 在家购物等 xff0c 我们使用电脑的时间越来越长 相信很多人都和小编一样 xff0c 经常遇到电脑的右下角出现出现弹窗广告的问题 要去叉掉就很麻烦 而且有时候想
  • VNC远程桌面使用方法

    参考 xff1a https blog csdn net weixin 41803874 article details 81233789 一共两台电脑 xff0c 分别为服务端和客户端 xff0c 为与场景联系方便 xff0c 我们将需要
  • 激光雷达闭环检测/地点识别算法OverlapTransformer/SeqOT(2022)

    最新激光雷达闭环检测 地点识别算法 OverlapTransformer已经完整开源 xff0c 相关论文已经被RAL IROS 2022收录 https github com haomo ai OverlapTransformer Ove
  • 我的创作纪念日

    初心未改 xff0c 继续向前
  • 最新激光雷达闭环检测/地点识别算法CVTNet(2023)

    CVTNet以激光点云多类投影生成的二维图为输入 xff0c 利用cross transformer将多类信息交叉融合 xff0c 为激光点云提取强特异性描述子 xff0c 实现SLAM闭环检测或全局定位功能 此外 xff0c CVTNet
  • python使用ffmpeg推流出现OSError: [Errno 2] No such file or directory

    python使用ffmpeg推流出现OSError Errno 2 No such file or directory 具体错误如下 xff1a Traceback span class token punctuation span mos
  • GDB调式工具学习笔记---单步执行和跟踪函数调用

    GDB调式工具学习笔记 单步执行和跟踪函数调用 简介1 单步执行和跟踪函数调用1 1 示例程序1 2 常用命令1 2 1 help1 2 2 list l 1 2 3 quit1 2 4 start1 2 5 next xff08 n xf
  • GDB调式工具学习笔记---断点

    GDB调式工具学习笔记 断点 2 断点2 1 示例代码2 2 常用命令2 2 1 display和undisplay2 2 2 break b 2 2 3 continue xff08 c xff09 2 2 4 disable2 2 6
  • C语言网络编程——UDP

    C语言网络编程 UDP 2 1 基于UDP的网络编程2 2 1 服务端实现2 2 2 客户端实现 2 1 基于UDP的网络编程 2 2 1 服务端实现 使用socket函数 xff0c 创建一个socket使用bind 函数 xff0c 绑
  • STM8S电源管理-重点活跃停机模式

    http blog sina com cn s blog 542bad910101qkru html
  • 多态的定义

    多态是什么 xff1f 多态 polymorphism 是面向对象编程 OOP object oriented programming 的一个重要特征 xff0c 顾名思义为多种形态 xff0c 详细解释为一个接口 xff0c 多种实现 x
  • 虚函数实现多态的原理

    1 C 43 43 中如何实现多态 基类中先声明一个虚函数至少有一个继承该基类的子类 2 虚函数实现多态的原理 当一个类中出现虚函数或着子类继承了虚函数时 xff0c 就会在该类中产生一个虚函数表 xff08 virtual table x
  • 停车场车牌识别项目

    停车场车牌识别项目 简介开发环境技术栈1 Sqlite2 TTS3 摄像头使用教程 实现效果图源码 简介 该项目的应用场景为停车场 xff0c 记录车辆的进出时间 xff0c 对车辆进行收费 开发环境 Windows 下的 QT 技术栈 Q
  • STM32串口输出字符串

    目录 串口步骤1 确定 IO 口并初始化2 初始化 UATR3 UART 中断配置4 编写 UART 中断服务函数5 1 方法一 xff1a 重定向 fputc 5 2 方法二 xff1a 将字符串分割成一个一个字符发送出去 效果附源码 串
  • 常用Linux命令

    目录 Shell常用Shell命令1 目录操作类2 文本操作类3 用户管理4 文件权限类5 磁盘管理类6 网络操作类7 控制终端类8 开关机类 Shell小技巧 Shell shell是一个应用程序 xff0c 作为用户与内核信息传递的桥梁
  • VSCode与Keil联合开发STM32

    目录 1 为什么要联合开发2 配置VSCode的环境1 安装c c 43 43 2 安装Embedded IDE3 设置编译工具4 导入 STM32 工程5 配置编译器选项6 烧录工具选择 3 附 1 为什么要联合开发 Keil容易出现中文
  • 8.类的继承

    目录 1 继承的定义2 继承的作用3 继承的语法4 类继承成员属性的访问权限5 利用参数列表 xff0c 初始化父类的私有成员6 继承中的构造函数与析构函数7 总结共继承的权限问题8 类中的隐藏问题9 类中的多继承10 类中多级继承11 菱
  • 14.数据成员属性

    目录 1 静态属性 xff1a 2 类中的静态成员 xff1a 3 类中的静态函数 xff1a 4 类中的const成员5 类中的常量成员6 类中的常量函数 xff1a 7 常量对象 xff1a 1 静态属性 xff1a 回顾C语言的静态变
  • 15.异常处理

    目录 1 为什么需要异常处理 xff1f 2 在c 43 43 中异常处理的方法 xff1f xff1f 3 异常的抛出4 异常的类型捕捉5 系统预定义的异常类型6 异常的再抛出 1 为什么需要异常处理 xff1f 用 new 运算符动态分