C++异常处理方法
Posted Linux编程学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++异常处理方法相关的知识,希望对你有一定的参考价值。
1 异常处理的任务
程序开发者总是希望自己所编写的程序都是正确无误的,而且运行结果也是完全正确的。但是这几乎是不可能的,智者千虑,必有一失,不怕一万,就怕万一。因此,程序开发者不仅要考虑程序没有错误的理想情况。更要考虑程序存在错误时的情况,应该能够尽快地发现错误,消除错误。
程序中常见的错误有两大类:语法错误和运行错误。在编译时,编译系统能发现程序中的语法错误,如关键字拼写错误,变量名未定义,语句末尾缺分号,括号不匹配等。编译系统会告知用户在第几行出错,是怎么样的错误。由于是在编译阶段发现的错误,因此,这类错误又称为“编译错误”。总的来说,这种错误是比较容易发现和校正的,因为,它们一般都是有规律的,在有了一定的编译经验以后,可以很快地发现出错的位置和原因并加以改正。
有的程序虽然能够通过编译,也能投入运行。但是,在运行过程中会出现异常,得不到正确的运行结果,甚至导致程序不正常终止,或出现死机现象。例如:程序在运行再过程中,使用了非法的内存地址,导致程序被系统结束。
人们希望程序不仅在正确的情况下能够正确运行,而且,程序出错的情况下,也能够作出相应的处理,而不致使程序莫名其妙地终止,甚至出现死机的现象。
在设计程序时,应当事先分析程序运行时可能出现的各种意外的情况。并且分别制定出相应的处理方法,这就是程序的异常处理的任务。
在运行没有异常处理的程序时,如果运行情况出现异常,由于程序本身不能处理,程序只能终止运行。如果在程序中设置了异常处理机制,则在运行情况出现异常时,由于程序本身已规定了处理的方法,于是程序的流程就转到异常处理代码段处理。用户可以指定进行任何的处理。
2 异常处理的方法
在一个小的程序中,可以用比较简单的方法处理异常,例如用if 语句判别除数是否为0,如果是0则输出一个出错信息。但是,在一个大的系统中,包含许多模块,每个模块又包含许多函数,函数之间又相互调用,比较复杂。如果在每一个函数中都设置处理异常的程序段,会使程序过于复杂和庞大,因此,C++采取的办法是:如果在执行一个函数过程中出现异常,可能不再本函数中处理,而是发出一个消息,传给它的上一级(即调用它的函数),它的上级捕捉到这个信息后进行处理。如果上一级的函数也不能处理,就再传给其上一级,由其上一级处理。如此逐级上送,如果到最高一级还无法处理,最后只好异常终止程序的执行。
C++处理异常的机制是由3个部分组成的,即检查(try),抛出(throw)和捕捉(catch)。把需要检查的语句放在 try 块中,throw 用来当出现异常时发出(形象地称为抛出,throw的意思是抛出)一个异常信息,而catch则用来捕捉异常信息,如果捕捉到了异常信息,就处理它们。
通过下面的例子,可以了解他们的使用方法。
程序运行结果如下:
可以看到,定义一个test类,类中有set[3]数组成员。那么,定义了add()函数来给数组添加成员。由于set[3]数组的容量有限,所以,在add()函数中给数组添加成员的时候,需要考虑数组的容量,如果数组已经满了,就不可以添加元素。
在上面的代码中,当add()插入元素失败的时候,我们只是返回该函数,并没有任何提示。那么,我们想着改进该机制,要求add()函数插入元素失败的时候,发出一个“警告信息”,那么,在代码中可以捕获这个警告信息。
C++提供了try-catch机制来处理异常。使用的方法如下:
(1) 通过throw 关键字抛出一个异常;
(2) 用try-catch包含的有异常的代码块,就可以捕获throw抛出的异常;
(3) 当try捕获到一个异常的时候,就结束try包含的代码块,直接跳转到catch中处理匹配的异常信息。
程序测试例子如下:
程序运行结果如下:
可以看到,在add()函数中,检测到set[]数组满的时候,不添加元素。此时,通过throw 关键字抛出一个异常信息,执行代码如下:
throw 666.999;
此时抛出一个异常,结束当前函数的执行,同时,抛出的异常信息是666.999数值。
然后,main()函数中,使用try-catch代码捕获异常。在try-catch中包含可能产生异常的函数。所以,把t.add()添加函数的操作,都包含在try-catch代码块中。
同时,catch可以捕获到异常,定义如下:
catch(double e)
cout << "捕获异常信息 e = " << e << endl;
此时,通过catch语句来捕获异常。那么,throw抛出666.999数值,这个数值是一个double类型。所以,我们定义double e变量,用来接收throw抛出的信息。
最终,抛出的666.999数值就设置给e变量。那么,输出变量e的值,就是throw抛出的异常信息。
那么,我们可以看的,通过tyr-catch语句,可以捕获throw抛出的异常信息。
注意,throw抛出怎么样的数据是由程序设计者自定,可以说任何类型的数据,包括自定义类型的数据,如类对象。
以上是关于C++异常处理方法的主要内容,如果未能解决你的问题,请参考以下文章