csdn_spider/blog/ds19991999/原创-- C++异常处理.md

275 lines
5.0 KiB
Markdown
Raw Normal View History

2021-02-27 15:01:45 +00:00
# 原创
C++异常处理
# C++异常处理
# 一、C++语言异常处理的实现
## 1.三个保留字
```
//try:可能发生异常的程序代码
//throw:抛出异常
//catch:捕获异常,进行异常处理
try
{
//try语句块
}
catch(异常类型1 参数1)
{
//针对类型1的异常处理
}
//throw语句在try语句块内
//当异常发生,系统找不到与该错误类型相匹配的错误处理模块,则函数
//terminate()将被自动调用默认功能是调用abort()终止程序执行
//错误处理函数set_terminate()函数来指定
# include <iosteam>
using namesapce
void aa()
{
cout<<"这是由用户指定的错误处理函数"<<endl;
exit(-1);
}
void main()
{
set_terminate(aa);//aa代替默认的abort()函数
try
{
throw"error";
}
catch(int){}
}
```
## 2.实例
```
//test1
# include <iosteam>
double divide(duoble,double);
void main()
{
double f1 = 0.0, f2 = 0.0;
try
{
cout<<"f1/f2="<<divide(f1,f2)<<"\n";
}
catch(double)
{
cout<<"被0除"<<"\n";
}
}
double divide(double x, double y)
{
if(y==0)throw 0.0;//抛出异常
return x/y;
}
//test2
# include <iosteam>
using namespace std;
void detail(int k);
{
cout<<"Start of detail function.\n";
if(k==0) throw 123;
cout<<"End of detail function.\n"
}
void compute(int i)
{
cout<<"Start of compute function.\n";
detail(i);
cout<<"End of compute function.\n";
}
int main()
{
int x;
cout<<"Enter x(0 will throw an exception):";
cin>>x;
try
{
compute(x);
}
catch(int i)
{
cout<<"Exception:"<<i<<endl;
}
cout<<"The end.\n";
return 0;
}
//test3
# include<iosteam>
using namespace std;
void main()
{
int i;
char ch;
cout<<"请输入一个整数和一个字符\n";
//如果输入为0则只会抛出0异常不会抛出异常
try
{
cin>>i>>ch;
if(i==0)throw 0;
if(ch=='!')throw '!';
}
catch(int)
{
cout<<"输入为0\n";
}
catch(char)
{
cout<<"输入字符!"<<endl;
}
cout<<"程序结束"<<endl;
}
//test4
# include <iosteam>
using namespace std;
class OutOfBounds
{
public:
OutOfBounds(int a)
{
i=a;
}
int indexValue()
{
return i;
}
private:
int i;
};
class Array
{
public:
int &operator[](int i)
{
if(i<0||i>=10)
throw OutOfBounds(i);
return a[i];
}
private:
int a[10];
};
void main()
{
Array a;
try
{
a[3]=30;
cout<<"a[1000]"<<a[1000]<<endl;
}
catch(OutOfBounds error)//捕获异常类
{
cout<<"Subscript value"<<error.indexValue()
cout<<"Out of bounds.\n";
}
return;
}
```
# 二、重新抛出异常和异常规范
## 1.重新抛出异常
```
//当catch语句捕获异常后不能完全处理异常
//catch语句块可以重新抛出异常交给更高级函数进行处理
# include <iosteam>
using namespace std;
void h()
{
throw 0;
}
void g()
{
try
{
h();
}
catch
{
cout<<"Catch in a\n";
throw;
}
}
int main()
{
try
{
g();
}
catch(int)
{
cout<<"Catch in main\n";
}
return 0;
}
```
## 2.异常规范
```
//如果程序运行时,函数抛出了一个没有被列在它的异常规范中的异常时
//系统调用C++标准库中定义的函数unexcepted(),而unexception()
//调用terminate()终止整个程序的运行
void f() throw(X,Y)
{
...
}
//函数f只能抛出X、Y异常,throw(X,Y)称为异常规范
//如果写成throw(),则表示不会抛出异常
```
# 三、C++标准库中的异常类
```
//C++异常层次根类为exception类exception类中的虚函数what()
//返回一个C语言风格的字符串为异常提供文本描述
//逻辑异常
length_error //长度异常
domain_error //时域异常
out_of_range_error //越界异常
invalid_argument //参数异常
//运行异常
range_error //范围错误
overflow_error //溢出(上溢)异常
underflow_error //溢出(下溢)
//test:exception 和logic_error类的使用方法
# include<exception>
# include<iosteam>
using namesapce std;
void main()
{
try
{
exception theError;
throw(theError);
}
catch(const exception &theError) //捕捉标准C++异常类的对象
{
cout<<theError.what()<<endl; //用what()成员函数显示出错的原因
}
try
{
logic_error theLogicError("Logic Error!");
throw(theLogicError);
}
catch(const exception theLogicError)
{
cout<<theLogicError.what()<<endl;
}
}
//运行结果
Unknown exception
Logic Error
```