C++:异常(下)

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

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

一:异常的重新抛出

大家看下面如果不在里面处理一下的话delete没有运行过。

#include<iostream>
#include<string>
using namespace std;
double division(int a, int b)
{
	
	if (b == 0) 
		throw "0不能做除数"; //这个类型是const char* 的类型 
	else 
		return a / b;
}
void func()
{// 这里可以看到如果发生除0错误抛出异常,下面的a没有得到释放。
 // 所以这里捕获异常后并不处理异常,异常还是交给外面处理,这里捕获了再重新抛出去。
 
	int* a = new int[10];
	try{
		cout << division(3, 1) << endl;

		cout << division(3, 0) << endl;
	}
	catch(...)
	{delete[] a;
		
		throw;

	}
	delete[] a;
}
int main()
{
	
	try
	{
		func();
	}
	catch(const char* a)
	{
		cout << a << endl;
	}
	return 0;
}

二:自定义异常

这里许多公司都有自定义异常,都有自己的规范,因为乱抛异常不好维护。我从网上找了个例子大家看看。这样大家都是throw派生类,到时候捕获基类就行。

#include <iostream>
#include <exception>
#include <string>

using namespace std;

// 自定义异常类,继承自std::exception
class MyException : public exception {
private:
string message; // 异常信息

public:
// 构造函数,接收异常信息
MyException(const string& msg) : message(msg) {}

// 重写what()函数,返回异常信息
virtual const char* what() const throw() {
return message.c_str();
}
};

int main() {
try {
// 抛出自定义异常
throw MyException("自定义异常发生");
} catch (const MyException& e) {
// 捕获并处理自定义异常
cout << e.what() << endl;
}
return 0;
}

三:c++标准库的异常

这里大家有兴趣可以自己查询,因为很多公司都是自定义异常,没用库里的,我也不多写了。

四:异常安全

1.构造函数不要抛异常,否则可能导致对象不完整或没有完全初始化

2.析构函数也不用抛异常,否则造成资源泄漏。


网站公告

今日签到

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