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是不会抛出异常,在函数后面写了,即使发生了异常也不会捕获

相关推荐
rannn_1114 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
不会代码的小猴4 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
青瓦梦滋5 小时前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
IKUN家族5 小时前
Spring IoC&DI
java·spring·rpc
一只旭宝5 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
山荷枝6 小时前
03-框架--Spring
java·后端·spring
我就是妖怪7 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·人工智能
ChaHae-In7 小时前
SpringBoot统一功能处理
java·spring boot·后端
coder!mq7 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding7 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言