c++非常处置惩罚
顺序运转时常会遇到一些非常情况,比方:做除法的时刻除数为 0;用户输入岁数时输入了一个负数;用 new 运算符动态分派空间时,空间不够致使没法分派;接见数组元素时,下标越界;翻开文件读取时,文件不存在等等。
这些非常情况,假如不能发明并加以处置惩罚,很能够会致使顺序崩溃。
所谓“处置惩罚”,可所以给出毛病提醒信息,然后让顺序沿一条不会失足的途径继承实行;也多是不能不终了顺序,但在终了前做一些必要的事情,如将内存中的数据写入文件、封闭翻开的文件、开释动态分派的内存空间等。
C++ 引入了非常处置惩罚机制。其基础思想是:函数 A 在实行历程当中发明非常时能够不加处置惩罚,而只是“拋出一个非常”给 A 的调用者,假定为函数 B。
拋出非常而不加处置惩罚会致使函数 A 马上中断,在这类情况下,函数 B 能够挑选捕捉 A 拋出的非常举行处置惩罚,也能够挑选置之度外。假如置之度外,这个非常就会被拋给 B 的调用者,以此类推。
假如一层层的函数都不处置惩罚非常,非常终究会被拋给最外层的 main 函数。main 函数应当处置惩罚非常。假如main函数也不处置惩罚非常,那末顺序就会马上非常地中断。
C++非常处置惩罚基础语法
C++ 经由历程 throw 语句和 try...catch 语句完成对非常的处置惩罚。throw 语句的语法以下:
throw 表达式;
该语句拋出一个非常。非常是一个表达式,其值的范例可所以基础范例,也可所以类。
try...catch 语句的语法以下: try { 语句组 }catch(非常范例) { 非常处置惩罚代码 }...catch(非常范例) { 非常处置惩罚代码 }
catch 能够有多个,但最少要有一个。
无妨把 try 和厥后{}中的内容称作“try块”,把 catch 和厥后{}中的内容称作“catch块”
try...catch 语句的实行历程是:实行 try 块中的语句,假如实行的历程当中没有非常拋出,那末实行完后就实行末了一个 catch 块背面的语句,一切 catch 块中的语句都不会被实行;假如 try 块实行的历程当中拋出了非常,那末拋出非常后马上跳转到第一个“非常范例”和拋出的非常范例婚配的 catch 块中实行(称作非常被该 catch 块“捕捉”),实行完后再跳转到末了一个 catch 块背面继承实行。
比方下面的顺序:
#include <iostream> using namespace std; int main() { double m ,n; cin >> m >> n; try { cout << "before dividing." << endl; if( n == 0) throw -1; //抛出int范例非常 else cout << m / n << endl; cout << "after dividing." << endl; } catch(double d) { cout << "catch(double) " << d << endl; } catch(int e) { cout << "catch(int) " << e << endl; } cout << "finished" << endl; return 0; }
顺序的运转效果以下:
9 6↙ before dividing. 1.5 after dividing. finished
申明当 n 不为 0 时,try 块中不会拋出非常。因而顺序在 try 块一般实行完后,超出一切的 catch 块继承实行,catch 块一个也不会实行。
顺序的运转效果也能够以下:
9 0↙ before dividing. catch\(int) -1 finished
当 n 为 0 时,try 块中会拋出一个整型非常。拋出非常后,try 块马上住手实行。该整型非常会被范例婚配的第一个 catch 块捕捉,即进入catch(int e)块实行,该 catch 块实行终了后,顺序继承今后实行,直到一般终了。
假如拋出的非常没有被 catch 块捕捉,比方,将catch(int e),改成catch(char e),当输入的 n 为 0 时,拋出的整型非常就没有 catch 块能捕捉,这个非常也就得不到处置惩罚,那末顺序就会马上中断,try...catch 背面的内容都不会被实行。
以上就是c++非常处置惩罚的要领的细致内容,更多请关注ki4网别的相干文章!