C++异常处理(try和catch)(⼩⽩篇)
在程序设计过程中,我们总是希望⾃⼰设计的程序是天⾐⽆缝的,但这⼏乎⼜是不可能的。即使程序编译通过,同时也实现了所需要的功能,也并不代表程序就已经完美⽆缺了,因为运⾏程序时还可能会遇到异常,例如当我们设计⼀个为⽤户计算除法的程序时,⽤户很有可能会将除数输⼊为零,⼜例如当我们需要打开⼀个⽂件的时候确发现该⽂件已经被删除了……类似的这种情况很有很多,针对这些特殊的情况,不加以防范是不⾏的。
我们通常希望⾃⼰编写的程序能够在异常的情况下也能作出相应的处理,⽽不⾄于程序莫名其妙地中断或者中⽌运⾏了。在设计程序时应充分考虑各种异常情况,并加以处理。
在C++中,⼀个函数能够检测出异常并且将异常返回,这种机制称为抛出异常。当抛出异常后,函数调⽤者捕获到该异常,并对该异常进⾏处理,我们称之为异常捕获。
C++新增throw关键字⽤于抛出异常,新增catch关键字⽤于捕获异常,新增try关键字尝试捕获异常。通常将尝试捕获的语句放在 try{ } 程序块中,⽽将异常处理语句置于 catch{ } 语句块中。
异常处理的基本语法如下所述。⾸先说⼀下抛出异常的基本语法:
throw 表达式;
抛出异常由throw关键字加上⼀个表达式构成。抛出异常后需要捕获异常以及异常处理程序,其基本语法如下:
try catch的使用方法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来执⾏。
附:cout、cerr、clog的区别
cerr:输出到标准错误的ostream对象,常⽤于程序错误信息;
clog:也是输出标准错误流(这点⼉和cerr是⼀样的)
cout是在终端显⽰器输出,cout流在内存中对应开辟了⼀个缓冲区,⽤来存放流中的数据,当向cout流插⼊⼀个endl,不论缓冲区是否漫了,都⽴即输出流中所有数据,然后插⼊⼀个换⾏符.
cerr流对象是标准错误流,指定为和显⽰器关联,和cout作⽤差不多,有点不同就是cout
通常是传到显⽰器输出,但可以被重定向输出到⽂件,⽽cerr流中的信息只能在显⽰器输出.
clog流也是标准错误流,作⽤和cerr⼀样,区别在于cerr不经过缓冲区,直接向显⽰器输出信息,⽽clog中的信息存放在缓冲区,缓冲区满或者遇到endl时才输出.
3.
C++Primer(第四版)
标准库定义了4个IO对象,处理输⼊时使⽤命名为cin的istream类型对象,这个对象也成为标准输⼊。处理输出时使⽤命名为cout的ostream类型对象,这个对象也称为标准输出。标准库还定义了另外两个ostream对象,分别命名为cerr和clog。cerr对象⼜叫标准错误,通常⽤来输出警告和错误信息给程序的使⽤者,⽽clog对象⽤于产⽣程序执⾏的⼀般信息。⼀般情况下,系统将这些对象与执⾏窗⼝联系起来,这样,当我们从cin读⼊时,数据从执⾏程序的窗⼝读⼊,当写到cout、cerr、clog时,输出写⾄同⼀窗⼝。运⾏程序时,⼤部分操作系统都提供了重定向输⼊或者输出流的⽅法。利⽤重定向可以
将这些流与所选择的⽂件联系起来

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。