###try语句块#c++
异常处理部分使用try语句块来处理异常。try语句块以try关键字开始,以一个或多个catch子句结束。try语句块中,使用throw抛出的异常被catch捕获并处理。windows
其语法规则为:数组
try{ program-statements }catch(exception-declaration){ handler-statements }catch(exception-declaration){ handler-statements } //..
其中try语句块中的program-statements为正常语句块,exception-declaration为异常声明,handler-statements为捕获到异常后的异常处理语句。dom
###throw和catch#函数
C++里异常有两种操作系统
一种是CPU发起的(好比非法内存访问等),强行中断当前执行的程序,并由运行环境执行适当的应对代码。 可是在windows环境下,如vc++中,底层直接是用的Win32异常来实现的,因此从操做系统上来看,全是Win32异常,并不会被c++的try/catch捕获。指针
一种是C++里用throw语句抛出的异常,这个的结果只是一个单纯的跳转。code
VC++若是编译的时候加/EHa参数 发生第一种异常的时候能够用C++的try/catch捕捉。对象
咱们使用throw来抛出异常,用catch来捕获异常,以下举例:继承
double a,b; while (cin<<a<<b){ try{ if (b != 0){ a=a/b; cout<<a<<endl; }else{ throw runtime_error("被0除"); } }catch(runtime_error err){ cout<<err.what()<<"\nTry again?(y or n)"<<endl; char c; cin<<c; if (!cin || c == 'n') break; } }
**栈展开:**若是抛出的异常的函数调用语句位于一个try,则检查与该try关联的catch子句,若是找到了匹配的catch,就使用该catch来处理异常,不然若是该try包含在其余try块中,则继续检查与外层try匹配的catch子句,若是仍没有,则退出当前主调函数,继续在调用了该函数的其余函数中寻找,以此类推。若是最终没有catch匹配,则调用标准库函数terminate退出该程序;
**栈展开过程当中对象被自动销毁:**块内局部对象会自动销毁,类类型对象会调用其析构函数;
**catch匹配类型:**容许throw很是量,catch捕获为常量;容许throw派生类,catch捕获为基类;数组被转换为指向数组(元素)类型的指针,函数被转换成直线该函数类型的指针;包括标准算数类型转换和类类型转换在内,其余全部转换规则都不能在匹配catch时使用;
**从新抛出:**当一个catch不能完整处理某个异常,能够将其从新抛出传递给另外一个catch语句,从新抛出还是一个throw语句,可是不包括任何表达式:throw;
**catch(...):**当使用catch来捕捉异常时,能够用catch(...)来捕获全部的异常。能够单独出现,也能够和其余的catch语句出现,若是catch(...)和其余的一块儿出现,则必须位于最后。
###C++中定义了一些标准异常:#
exception //最多见的问题 runtime_error //只有在运行时才能检测出的问题 range_error //运行时错误:生成计算结果超出了有意义的值域范围 overflow_error //运行时错误:计算上溢 underflow_error //运行时错误:计算下溢 logic_error //程序逻辑错误 domain_error //逻辑错误:参数对应的结果值不存在 invalid_argument //逻辑错误:无效参数 length_error //逻辑错误:试图建立一个超出该类型最大长度的对象 out_of_range //逻辑错误:使用一个超出有效范围的值
此外还有