C++的异常处理用到:try{}catch(){}
try块是一个普通的程序块,就一般运行情况而言跟没有tryd的情况是一样的,但在异常出现时,往往把可能出现异常的一些语句,包括函数的调用,比如在数据库编程编程中,一些管理信息系统在连接数据库的时候(特别是ADO方式),往往会把数据库的连接与表的打开语句放在里面,若连接失败或打开失败,则抛出一个异常,异常在紧随的catch语句中被捕获,然后执行catch对应的语句,详细的下面再说。
异常的抛出机制
异常是什么意思?这个我觉得用我们一般的思维去想就可以了,英语里可以通俗地说是:something bad。
异常抛出往往是用关键字throw,一般是“throw 对象;”注意的是,throw抛出的是对象的一个拷贝,处理的手段跟函数的return有相似之处,但是两者又有不同,return的类型是必须跟函数原先说明的返回值是一样的;而throw则不用理会调用它的函数的返回类型是什么。
try块
由于所有程序必须要做的工作都放在try块中,而如何处理错误是集中在catch块中,因此,代码会具有更高的可读性,也方便编写,因为我们不必在编写必要的工作时,时时刻刻都想着如何去处理出现的错误,对于阅读者来说,对于有多少可能出现的异常和相应的处理方式,更是一目了然。
异常的匹配机制
catch括号内会有对应的参数类型,当throw出一个对象,就会在后面的一个或几个catch中查找出与对象类相关的第一个语句,并执行这个catch后中括号内的子句,而且后面的catch语句都不再作匹配判断了,直接跳过。
在这里,再深一层去想,你会发现在基类与派生类的异常匹配你会出现疑问,幸好早就有大师为我们回答了这个问题,Bruce Eckel的C++编程思想里面有这样的两个方面:
Ⅰ、一个对象或者是指向派生类的引用都与基类处理器匹配,这就是异常匹配的不完全相关性,也就是我上面说相关而不是说相同的原因。
也由于这个原因,一般首先捕获派生类的异常,再捕捉基类异常。
Ⅱ、如果异常处理器(也就是catch)是针对对象而不是引用,那么异常对象将会被“切割”,变为基类对象,其他派生的信息都会丢失,因此通常在catch中使用引用而不是值参数,以防异常对象所包含信息被切割掉(这个做法还可以避免匹配时对异常对象的拷贝)。
捕获所有异常
顾名思义,就是一个异常处理器能捕捉到所有的异常,通常这是放在异常处理器列表的最后,以免把其他的异常处理器给屏蔽掉。
其实现方法就是:
catch(...){}
(通常这是用于清理资源)
喜欢记录的人还是很多的哈哈,贴一个 http://softbbs.pconline.com.cn/7251662.html