一、什么是异常
例如open()、creat()函数会有返回值,来判断是否成功执行。
异常是一种程序控制机制,与函数机制独立和互补。异常就是冲着改变程序控制结构,以适应面向对象程序更有效地工作这个主题。在错误处理方面获得最大的好处。
二、异常的基本语法
1、遇到问题抛出异常(throw 0)
抛出的类型不确定,不受函数的返回值限制。
2、尝试执行函数
try
{
}
3、接收异常(catch)
例:catch(int) //接收整型
{
}
#include <iostream>
using namespace std;
int Div(int x,int y)
{
if(0 == y)
{
//return -1;
//throw 0; //抛出异常
throw 'a';
}
return x / y;
}
int main()
{
int a,b;
cin >> a >> b;
try{ //把可能抛出异常的代码,放在try语句中
cout << Div(a,b) << endl;
}
catch(int)
{
cout << "zero exception" << endl;
}
catch(char)
{
cout << "char exception" << endl;
}
return 0;
}
4、特点:跨越函数
将函数的异常交给上一个函数来实现,不需要再在本函数实现,本函数专注于实现具体功能
int DDiv(int x,int y)
{
if(0 == y)
{
throw 0; //函数嵌套的情况下,返回值为0了,异常抛出就不会返回,单纯停止函数运行
}
return x / y;
}
int Div(int x,int y)
{
return DDiv(x,y);
}
5、限制异常抛出的类型
1、void func() throw (A, B, C , D); //这个函数func()能够且只能抛出类型A B C D及其子类型的异常。
2、如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常,例如:
void func();
3、一个不抛掷任何类型异常的函数可以声明为:void func() throw();
6、抛出对象异常(优先使用引用)
1、抛出一个对象(引用接就一个对象,拷贝接两个对象)
抛出一个对象,接收拷贝一个对象,一共有两个对象
抛出:throw Test()
接收;catch(Test t)
{
}
2、抛出对象地址(new delete 需要手动释放)
throw new Test;
catch(Test *t)
{
delete t; //手动释放
}
三、使用标准程序库异常
使用异常库基类对象接收异常库衍生类对象
1 #include <iostream>
2 #include <exception>
3
4 using namespace std;
5
6 int main()
7 {
8 try{
9 int *p = new int[-1];
10 }
11
12 catch(exception &e) //基类接收任意一个派生类对象
13 {
14 cout << e.what() << endl;
15 }
16
17 delete p;
18
19 return 0;
20 }