异常处理
1.抛出异常(Throwing an Exception)
异常处理机制主要有两个主要成分:异常的鉴定和发出
成员函数和非成员函数均可能产生异常和处理异常,异常出现以后,程序的正常执行被暂停(suspended),于此同时,异常处理机制会开始搜索程序中有能力处理这一异常的位置,异常被处理完毕后,程序会继续(resume)从异常点执行下去;
void overflowfun()
{
cout<<“iterator overflow”<<endl;
}
void nomalfun(){}
inline void Aclass::
func()
{
if(b>=20)
throw overflowfun();//若有异常抛出则不执行下面的nomalfun
nomalfun();
}
异常是种对象,最简单的异常是整数或者字符串
throw 42;//异常为整数
throw "panic: no buffer;";//异常对象问字符串
2.捕获异常(Catching an Exception)
catch子句用来捕获被抛出的异常对象。
catch子句由三部分组成:
- 关键字catch;
- 小括号()内的一个类型或对象;
- 大括号{}内的一组语句,用于异常处理;
catch catch 捕获到与之相对应的异常时,执行{}中的异常处理语句;
class A
{};
//捕获到整数的异常
bool some_function
{
bool status=true;
catch(int a )
{
fun1();//处理异常函数
}
//捕获到字符串的异常
catch(const char * str )
{
fun2();//处理异常函数
}
//捕获到类对象的异常
catch(A &a)
{
fun3();//处理异常函数
}
return status;
}
如果想要捕获任何类型的异常,只需在异常声明部分制定(…)即可;如下所示:
catch(...)//捕获任何类型的异常
{
fun();
}
3.提炼异常(Trying for an Exception)
try块与catch子句相应而生。try块以关键字try开始,后接大括号{},大括号内有一连串的程序语句;catch子句放在try块的末尾,若try块中有任何异常发生时,接下来由catch子句中的语句进行处理。
...
try//里面要有能抛出异常的语句,throw ···
{
while (frist!=last)
{
if(*frist==elme)
std::cout<<"hahahaha"<<std::endl;
++first;
}
}
catch(A &a)//try块内有任何异常抛出,我们只捕获类型为A的异常
{
fun3();//任意代码均可
}
...
4.标准异常类(The Standard Exception)
-
bad_alloc异常对象 :
new表达式无法从程序的空闲空间中分配足够的内存时,将会抛出bad_alloc异常对象。new表达式无法从程序的空闲空间中分配足够的内存时,将会抛出bad_alloc异常对象。 -
标准异常类exception
标准库提供一套异常类,名为exception的抽象基类,我们自己的异常类可以继承于他。
//标准异常类的头文件
#include<exception>