程序运行过程中由于外界的条件导致程序无法正常运行下去。
好处:有清晰的错误处理代码,将业务逻辑和错误处理分离
抛出异常:
throw ...
throw
throw会带着throw的内容不断向上回溯并终止回溯到的每一级运行到的程序,直到回溯到try
throw的内容通常是本地变量,存储在堆栈中,在退出throw所在的程序段时并不会立即销毁,而是会被throw到向上的层级中。不够会被适当地销毁,在合适的时机。
异常捕捉:
catch(...){}
catch到异常后 ,执行catch的内容且不再继续执行try的代码而是向下执行
catch(...)
{
throw;
}
catch中的throw会自动将catch到的内容throw,无需参数;
这种行为叫做异常的传播(propagate the exception)
原因:层级不够无法处理当前异常,仅做记录/小调整,交给更高层级处理问题
有多个catch的时候,按照书写顺序,顺序执行,执行catch时会检查,是否完全匹配,是否是catch参数类型的子类(仅限引用和指针???),catch的参数是否是...
catch(...):捕捉所有异常 ...是关键字!!
但是无法获取异常对象
应该作为最后的补救措施
最常用exception:输入输出(I/O设备,网络,通信)
try block:
try{}
declaration with exception specification:
void abc(int a) : throw(MathErr) {...}
在函数abc中,最多抛出MathErr,括号中的所有异常种类(不是一定会抛出)
throw():不抛异常
无throw()声明:不做检查,不知道会抛什么
new:如果内存不够,会抛出bad_alloc异常
catch(bad_alloc& e)