异常上: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.析构函数也不用抛异常,否则造成资源泄漏。