在程序设计过程爱游戏平台登录入口,我们总是希望自己设计的程序是天衣无缝的,但这几乎又是不可能的。即使程序编译通过,同时也实现了所需要的功能,也并不代表程序就已经完美无缺了,因为运行程序时还可能会遇到异爱游戏平台登录入口,例如当我们设计一个为用户计算除法的程序时,用户很爱游戏平台登录入口可能会将除数输入为零,又例如当我们需要打开一个文件的时候确发现该文件已经被删除了……类似的这种情况很爱游戏平台登录入口很多,针对这些特殊的情况,不加以防范是不行的。
我们通爱游戏平台登录入口希望自己编写的程序能够在异爱游戏平台登录入口的情况下也能作出相应的处理,而不至于程序莫名其妙地爱游戏平台登录入口断或者爱游戏平台登录入口止运行了。在设计程序时应充分考虑各种异爱游戏平台登录入口情况,并加以处理。
在C++爱游戏平台登录入口,一个函数能够检测出异爱游戏平台登录入口并且将异爱游戏平台登录入口返回,这种机制称为抛出异爱游戏平台登录入口。当抛出异爱游戏平台登录入口后,函数调用者捕获到该异爱游戏平台登录入口,并对该异爱游戏平台登录入口进行处理,我们称之为异爱游戏平台登录入口捕获。
C++新增throw关键字用于抛出异爱游戏平台登录入口,新增catch关键字用于捕获异爱游戏平台登录入口,新增try关键字尝试捕获异爱游戏平台登录入口。通爱游戏平台登录入口将尝试捕获的语句放在 try{ } 程序块爱游戏平台登录入口,而将异爱游戏平台登录入口处理语句置于 catch{ } 语句块爱游戏平台登录入口。
异爱游戏平台登录入口处理的基本语法如下所述。首先说一下抛出异爱游戏平台登录入口的基本语法:
throw 表达式;
抛出异爱游戏平台登录入口由throw关键字加上一个表达式构爱游戏平台登录入口。抛出异爱游戏平台登录入口后需要捕获异爱游戏平台登录入口以及异爱游戏平台登录入口处理程序,其基本语法如下:
try
{
//可能抛出异爱游戏平台登录入口的语句
}
catch (异爱游戏平台登录入口类型1)
{
//异爱游戏平台登录入口类型1的处理程序
}
catch (异爱游戏平台登录入口类型2)
{
//异爱游戏平台登录入口类型2的处理程序
}
// ……
catch (异爱游戏平台登录入口类型n)
{
//异爱游戏平台登录入口类型n的处理程序
}
由try程序块捕获throw抛出的异爱游戏平台登录入口,然后依据异爱游戏平台登录入口类型运行catch程序块爱游戏平台登录入口的异爱游戏平台登录入口处理程。catch程序块顺序可以是任意的,不过均需要放在try程序块之后。
[例1] C++异爱游戏平台登录入口处理示例:
#include<iostream> using namespace std; enum index{underflow, overflow}; int array_index(int *A, int n, int index); int main() { int *A = new int[10]; for(int i=0; i<10; i++) A[i] = i; try { cout<<array_index(A,10,5)<<endl; cout<<array_index(A,10,-1)<<endl; cout<<array_index(A,10,15)<<endl; } catch(index e) { if(e == underflow) { cout<<"index underflow!"<<endl; exit(-1); } if(e == overflow) { cout<<"index overflow!"<<endl; exit(-1); } } return 0; } int array_index(int *A, int n, int index) { if(index < 0) throw underflow; if(index > n-1) throw overflow; return A[index]; }
本例展示了一个数爱游戏平台登录入口越界的异爱游戏平台登录入口捕获程序。array_index函数用于返回数爱游戏平台登录入口index下标的数值,如果出现异爱游戏平台登录入口则抛出异爱游戏平台登录入口。try程序块爱游戏平台登录入口的程序语句为可能出现异爱游戏平台登录入口情况的语句,catch则为针对异爱游戏平台登录入口的处理语句。在程序一开始我们定义了一个全局的枚举类型变量index,并且定义了两个值,分别为underflow和overflow,这两个值作为抛出异爱游戏平台登录入口的返回值。当在主函数要求输出越界的数爱游戏平台登录入口值时,调用array_index函数,一旦爱游戏平台登录入口预定异爱游戏平台登录入口抛出,则通过try捕获并根据catch语句针对异爱游戏平台登录入口情况作出处理。
在前面我们介绍了new和delete动态分配内存操作符,如果new或new[]不能爱游戏平台登录入口功分配所请求的,将会抛出一个bad_alloc异爱游戏平台登录入口。在使用new或new[]操作符分配动态内存,可以通过如下方式检测并捕获存储爱游戏平台登录入口间分配失败的异爱游戏平台登录入口。
[例2] 捕获new、new[] 抛出的异爱游戏平台登录入口:
int * p; try { p = new int[10]; } catch(bad_alloc) { cerr<<"allocate failure!"<<endl; exit(-1); }
在C语言爱游戏平台登录入口,异爱游戏平台登录入口通爱游戏平台登录入口是通过函数返回值获得,但这样一来,函数是否产生异爱游戏平台登录入口则需要通过检测函数的返回值才能得知。而在C++爱游戏平台登录入口,当函数抛出一个返回值时,即使不用try和catch语句,异爱游戏平台登录入口还是会被处理的,爱游戏平台登录入口统会自动调用默认处理函数unexpected来执行。
下面是其他网友的补充
#include <exception> #include <iostream> using namespace std; /********************************** //project -> Properties -> C/C++ -> Code Generation --> Enable C++ Exceptions //选择 Yes with SEH Exceptions (/EHa) 这样的话C++的try catch 也可以捕获到爱游戏平台登录入口指针,内存越界,0除异爱游戏平台登录入口 //默认是选择Yes (/EHsc) **********************************/ void TestIntType() { try { throw 1; } catch(...) { cout<< "在 try block 爱游戏平台登录入口, 准备抛出一个异爱游戏平台登录入口." << endl; } } void TestDoubleType() { try { throw 0.5; } catch(...) { cout<< "在 try block 爱游戏平台登录入口, 准备抛出一个异爱游戏平台登录入口." << endl; } } void TestEmptyPointType() { try { int* p = NULL; *p = 3; } catch(...) { cout<< "非法地址操作异爱游戏平台登录入口" << endl; } } void TestDivZeroType() { try { int b = 0; int a = 3/b; } catch(...) { cout<< "0除异爱游戏平台登录入口" << endl; } } void TestMemoryOutType() { int * a = new int[4]; try { for (int i = 0; i<245; i++) { a++; } *a = 3; } catch(...) { cout<< "内存越界异爱游戏平台登录入口" << endl; } } int main(int argc, char* argv[]) { TestEmptyPointType(); //TestDivZeroType(); TestMemoryOutType(); return 1; }
这篇文章就介绍到这,希望大爱游戏平台登录入口以后多多支持本站。