c++异常处理 和 栈解旋

2023-05-16


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

//异常的基本语法
//异常类
class My_exception
{
public:
    My_exception()
	{
	    cout<<"构造函数调用"<<endl;
	
	}
	~My_exception()
	{
	
	    cout<<"析构函数调用"<<endl;
	}
};

int divide(int x,int y)
{
    if(y == 0)
	{
	    throw y;
	}
	return x/y;
	

}
//异常跨函数
//异常必须处理


int mian()
{
    try{
       divide(10,0)
   
   

    }catch(int e)
    {
     cout<<"divide by 0"<<"e"<<e<<endl;
    }


    return 0;
}

c++异常处理

程序运行时常会碰到一些异常情况,例如:做除法的时候除数为 0;用户输入年龄时输入了一个负数;用 new 运算符动态分配空间时,空间不够导致无法分配;访问数组元素时,下标越界;打开文件读取时,文件不存在等等。

这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃。

所谓“处理”,可以是给出错误提示信息,然后让程序沿一条不会出错的路径继续执行;也可能是不得不结束程序,但在结束前做一些必要的工作,如将内存中的数据写入文件、关闭打开的文件、释放动态分配的内存空间等。

C++ 引入了异常处理机制。其基本思想是:函数 A 在执行过程中发现异常时可以不加处理,而只是“拋出一个异常”给 A 的调用者,假定为函数 B。

拋出异常而不加处理会导致函数 A 立即中止,在这种情况下,函数 B 可以选择捕获 A 拋出的异常进行处理,也可以选择置之不理。如果置之不理,这个异常就会被拋给 B 的调用者,以此类推。

如果一层层的函数都不处理异常,异常最终会被拋给最外层的 main 函数。main 函数应该处理异常。如果main函数也不处理异常,那么程序就会立即异常地中止。

std::exception是所有标准异常的基类。标准异常的继承关系如下:

C++异常处理基本语法

C++ 通过 throw 语句和 try...catch 语句实现对异常的处理。throw 语句的语法如下:

throw 

该语句拋出一个异常。异常是一个表达式,其值的类型可以是基本类型,也可以是类。

try

catch 可以有多个,但至少要有一个。

不妨把 try 和其后{}中的内容称作“try块”,把 catch 和其后{}中的内容称作“catch块”

try...catch 语句的执行过程是:执行 try 块中的语句,如果执行的过程中没有异常拋出,那么执行完后就执行最后一个 catch 块后面的语句,所有 catch 块中的语句都不会被执行;如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个“异常类型”和拋出的异常类型匹配的 catch 块中执行(称作异常被该 catch 块“捕获”),执行完后再跳转到最后一个 catch 块后面继续执行。

例如下面的程序:

#include 

程序的运行结果如下:

9 

说明当 n 不为 0 时,try 块中不会拋出异常。因此程序在 try 块正常执行完后,越过所有的 catch 块继续执行,catch 块一个也不会执行。

程序的运行结果也可能如下:

9 

当 n 为 0 时,try 块中会拋出一个整型异常。拋出异常后,try 块立即停止执行。该整型异常会被类型匹配的第一个 catch 块捕获,即进入catch(int e)块执行,该 catch 块执行完毕后,程序继续往后执行,直到正常结束。

如果拋出的异常没有被 catch 块捕获,例如,将catch(int e),改为catch(char e),当输入的 n 为 0 时,拋出的整型异常就没有 catch 块能捕获,这个异常也就得不到处理,那么程序就会立即中止,try...catch 后面的内容都不会被执行。

1. try{} catch(){}

c++异常处理涉及到三个异常关键字:try、catch、throw

    try
    {
        throw "error";
    }
    catch(const char* e)
    {
        cout<<"Hello error"<<endl;
    }
    try
    {
        std::bad_alloc t;
        throw t;
    }
    catch(std::bad_alloc &e)
    {
        cerr <<e.what()<<'\n';
    }
    try
    {
        throw std::exception();
    }
    catch(...)//捕获所有异常
    {
        std::cerr << "Hello exception" << '\n';
    }

标准异常
2. 如何定义自己的异常

 

定义自己的异常MyException

struct MyException : public exception
{
  const char * what () const throw ()
  {
    return "C++ Exception";
  }
};

需要重载what方法。

以上就是c++异常处理的方法的详细内容,希望对你有所帮助。

您可能感兴趣的文章:

  • C++中的异常处理机制详解
  • c++异常处理机制示例及详细讲解
  • 深入了解C++异常处理
  • C++学习笔记之浅谈异常处理
  • 一篇文章带你入门C++的异常处理
  • 详解C++异常处理(try catch throw)完全攻略
  • C++常见异常处理原理及代码示例解析
  • 详解C++异常处理机制示例介绍
  • https://blog.csdn.net/sinat_36304757/article/details/106950470
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++异常处理 和 栈解旋 的相关文章

  • Prometheus 到底 NB 在哪里?- 每天5分钟玩转 Docker 容器技术(84)

    本节讨论 Prometheus 的核心 xff0c 多维数据模型 我们先来看一个例子 比如要监控容器 span style background color rgb 216 216 216 webapp1 span 的内存使用情况 xff0
  • 解读人生的四种汉堡模型

    解读人生的四种汉堡模型 自然界给了每一个人幸福的机会 xff0c 人们都知道 xff0c 却不知如何得到它 克劳狄 年度最重要的壁球赛就要临近了 我每天的训练已经极度艰苦 xff0c 同时还要严格控制饮食 尽管我的饮食习惯已经相当健康 xf
  • 进程间通信———共享内存的原理

    这篇写的不错给出链接 https blog csdn net ljianhui article details 10253345 下图是两个进程间使用共享内存通信的示意图 xff1a 进程A和进程B在操作系统os中都有自己的虚拟内存空间 这
  • linux进程间通信-共享内存

    linux进程间通信 共享内存 一 共享内存介绍 共享内存可以从字面上去理解 xff0c 就把一片逻辑内存共享出来 xff0c 让不同的进程去访问它 xff0c 修改它 共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式
  • Linux ipcs命令与ipcrm命令的用法详解

    以下是对Linux中的ipcs命令与ipcrm命令的用法进行了介绍 xff0c 需要的朋友可以过来参考下 是linux uinx上提供关于一些进程间通信方式的信息 xff0c 包括共享内存 xff0c 消息队列 xff0c 信号 ipcs用
  • c++11多线程编程 condition_variable wait notify_one notify_all 第八讲

    1 条件变量std condition variable wait notify one notify all wait 用来等一个东西 1 如果第二个参数返回值是true xff0c 那么这一行就继续往下运行 2 如果第二个参数返回值是f
  • c++11多线程 async、future、packaged_task、promise 第九讲

    1 std async std future创建后台任务并返回 2 std packaged task 3 std promise 4 小结 一 std async std future创建后台任务并返回 希望线程返回一个结果 xff1b
  • c++11多线程 windows临界区、其他各种mutex互斥量 第十二讲

    1 windows临界区 2 多次进入临界区实验 3 自动析构技术 4 recursive mutex递归的独占互斥量 5 带超时的互斥量std timed mutex和std recursive timed mutex include l
  • python 入门 第一讲 9种数据类型

    python语言简洁 计算1 100的整数和 result 61 0 for in range 1 100 result 43 61 i print s 计算并输出n xff01 def fact n if n 61 61 1 return
  • python 入门 第二讲 读取日志文件分析

    https www bilibili com video av77410524 p 61 29 计算传感器日志文件中温度数据的平均值 日志文件包含1万条数据温度数据在文件的第3列输入 xff1a 日志文件 sensor data txt输出
  • python 入门 第三讲 读取中文分析

    统计中文词语出现的次数 以政府一号文件为例 xff0c 统计出现的中文词语数量按照一定标准输出 xff0c 如出现次数等需要解决中文分词问题 xff0c 如 xff1a 这是一门好课 gt 这是 一门 好课 输入 xff1a 2018年一号
  • docker命令

    1 docker version docker version 显示 Docker 版本信息 docker version 例如 xff1a span class token comment docker version span Clie
  • python 入门 第四讲 基本数据类型

    python主要包括9中基本数据类型 数值类型 xff1a 整数 浮点数 复数字节类型 xff1a 字符串 字节串组合类型 xff1a 集合 元祖 列表 字典 为什么会出现不确定尾数 xff1f 计算机 不确定尾数问题来源于浮点数在计算机中
  • Linux - Shell - 在多个文件中查找关键字

    https www cnblogs com xy14 p 11735343 html 1 概述 在多个文件中 查找内容 2 想干啥 目的 在 多个文件 中 查找内容准备 之前在 单个文件里 查找过内容 工具 awk 前提 文件有固定格式查找
  • protobuf repeated数组类型的使用

    http www cppblog com API archive 2014 12 09 209070 aspx protobuf是Google开发的一个序列化框架 xff0c 类似XML xff0c JSON xff0c 基于二进制 xff
  • 分治法,迭代与动态规划及贪心算法感悟

    分治法 xff0c 动态规划法 xff0c 贪心算法这三者之间有类似之处 xff0c 比如都需要将问题划分为一个个子问题 xff0c 然后通过解决这些子问题来解决最终问题 但其实这三者之间的区别还是蛮大的 1 分治法 分治法 xff08 d
  • Python字符串操作大全

    Python中字符串的定义 xff1a 由Unicode码点组成的不可变序列 xff08 Strings are immutable sequences of Unicode code points xff09 Python内置函数提供了强
  • python 入门第五讲 分支与循环

    for i in range 1 15 print i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 从M开始 xff0c 到N结束 xff0c K为步长 for c in 34 hello 34 print c end
  • python 入门第六讲 异常处理

    1 异常的基本用法 2 异常的高级用法 ZeroDivisionError TypeError def foo a try b 43 61 100 a except ZeroDivisionError print 34 can not di
  • python 入门第1七讲 函数的定义与使用

    单元开篇 xff1a 函数定义和使用 1 函数的定义和调用 2 函数的参数传递 3 局部变量和全局变量 4 lambda函数 xff08 匿名函数 xff09 5 函数递归 函数相关的保留字 def 声明函数 return global x

随机推荐