C++----异常

1. 异常

  1. 程序出现问题时,通过抛出(throw)⼀个对象来引发⼀个异常,抛出对象的类型决定了由哪个catch语句来解决异常
c 复制代码
#include<iostream>
using namespace std;
	double Divide(int a, int b)
	{
		try
		{
			// 当b == 0时抛出异常 
			if (b == 0)
			{
				string s("Divide by zero condition!");
				throw s;
			}
			else
			{
				return ((double)a / (double)b);
			}
		}
		catch (int errid)
		{
			cout << errid << endl;
		}
		return 0;
	}
	void Func()
	{
		int len, time;
		cin >> len >> time;
		 try
		{
			cout << Divide(len, time) << endl;
		}
		catch (const char* errmsg)
		{
			cout << errmsg << endl;
		}
		cout << __FUNCTION__ << ":" << __LINE__ << "行执行" << endl;
	}
	int main()
 	{
		while (1)
		{
			try
			{
				Func();
			}
			catch (const string& errmsg)
			{
				cout << errmsg << endl;
			}
		}
		return 0;
	}

这里就是由main函数里的catch来捕获异常

  1. 捕捉异常类型一样时,离抛异常调用链近的优先调用,这里把Func()里的捕捉异常类型改成 string &errmsg时,就会调用Func里的catch

  2. 无论是否抛异常,throw后面的语句都不会被执行,如果不抛异常会继续执行try后面的语句

  3. ⼀旦程序开始执行异常处理程序,沿着调用链创建的对象都将销毁,这里在跳到main函数栈帧里执行catch之前,会先把Func里的对象都销毁

  4. 抛出异常对象后,会生成⼀个异常对象的拷贝,因为抛出的异常对象可能是⼀个局部对象,所以会生成一个拷贝对象,这个拷贝的对象会在catch语句后销毁(这里的处理类似于函数的传值返回)

2. 栈展开

  1. 如果当前函数中没有try/catch语句,或者有try/catch语句但是类型不匹配,则退出当前函数,继续
    在外层调用函数链中查找,这个查找catch过程被称为栈展开

  2. 如果到达main函数,依旧没有找到匹配的catch子句,程序会调用标准库的 terminate 函数终止程序。

  3. 如果找到匹配的catch子句处理后,catch子句代码都会继续执行。

  4. 允许权限缩小,可以拿const char捕获char,也可以拿基类对象的指针或引用捕获派生类对象

  5. 如果到main函数,异常仍旧没有被匹配就会终止程序,所以⼀般main函数中最后都会使用catch(...),它可以捕获任意类型的异常,但是是不知道异常错误是什么

  6. noexcept是不会抛出异常,在函数后面写了,即使发生了异常也不会捕获

相关推荐
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
炸膛坦客8 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
旖-旎8 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
鱟鲥鳚8 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
Henry Zhu1239 小时前
C++中的特殊成员函数与智能指针
c++
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
_wyt00111 小时前
多重背包问题详解
c++·背包dp
爱笑的源码基地11 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415912 小时前
TCP超时重传机制是为了解决什么问题?
java