C++:异常(上)

发布于:2024-12-18 ⋅ 阅读:(93) ⋅ 点赞:(0)

一:C语言的处理错误机制

1.assert :大家肯定都用过,错了直接终止程序,这个挺暴力的。你想,比如你在软件中输入一个违禁词,直接把你软件崩了,那多不好。

2.返回错误码:这个需要程序员自己去找错误。

二:C++中异常概念

在C++中,异常处理是一种在程序运行时处理错误的机制。它使用trycatchthrow关键字来实现。当程序中出现错误时,可以使用throw关键字抛出一个异常,然后在try块中捕获并使用catch块进行处理

三:异常的使用

#include<iostream>
#include<string>
using namespace std;
double division(int a, int b)
{
	if (b == 0) 
		throw "0不能做除数"; //这个类型是const char* 的类型 
	else 
		return a / b;
}
int main()
{
	try
	{
		cout << division(3, 1)<<endl;
		cout << division(3, 0) << endl;
	}
	catch(const char* a)
	{
		cout << a << endl;
	}
	return 0;
}

四:异常抛出和匹配原则

1. 异常是通过 抛出对象而引发 的,该 对象的类型 决定了应该激活哪个 catch 的处理代码。
2. 选中的处理代码 是调用链中 与该对象类型匹配且离抛出异常位置最近 的那一个。
3. 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,
所以会生成一个拷贝对象,这个拷贝的临时对象会在被 catch 以后销毁。(这里的处理类似
于函数的传值返回)
4.  实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配, 可以抛出的派生类对象,
使用基类捕获,这个在实际中非常实用。
5. catch(...) 可以捕获任意类型的异常,问题是不知道异常错误是什么。

五:栈展开:

1. 首先 检查 throw 本身是否在 try 块内部,如果是再查找匹配的 catch 语句 。如果有匹配的,则
调到 catch 的地方进行处理。
2. 没有匹配的 catch 则退出当前函数栈,继续在调用函数的栈中进行查找匹配的 catch
3. 如果到达 main 函数的栈,依旧没有匹配的,则终止程序 。上述这个沿着调用链查找匹配的
catch 子句的过程称为 栈展开 。所以实际中我们最后都要加一个 catch(...) 捕获任意类型的异
常,否则当有异常没捕获,程序就会直接终止。
4. 找到匹配的 catch 子句并处理以后,会继续沿着 catch 子句后面继续执行。

异常下:C++:异常(下)-CSDN博客


网站公告

今日签到

点亮在社区的每一天
去签到