1.异常处理任务:语法错误和运行错误。例如:
1)在一系列计算过程中,出现除数为0的情况。
2)内存空间不够,无法实现指定操作。
3)无法打开输入文件,因而无法读取数据。
4)输入数据的数据类型有错误。
2.异常处理方法
c++采取的办法:如果在执行一个函数过程中出现异常,可以不在本函数中立即处理,而是发出一个信息,传递给它的上一级(即调用它的函数),它的上级扑捉到这个信息后处理。如果上一级不能处理,就继续传给上一级,由上一级处理。由此逐级上传,如果直到最高级也不能处理,最后只好异常终止程序的执行。
C++处理机制:检查(try)、抛出(throw)和捕捉(catch)。把需要检查的语句放在try模块中,thow用来当出现异常时发出一个异常信息,而catch则哟过来捕捉异常信息,如果捕捉到了异常信息,就处理它。
下面讲述异常处理的语法。
throw语句一般是由throw运算符和一个数据组成的,其形式为
throw 表达式;
try-catch的结构为
try
{被检查的语句}
catch(异常信息类型[变量名])
{进行异常处理的语句}
说明:
(1) 被检测的函数必须放在try块中,否则不起作用。
(2) try块和catch块作为一个整体出现,catch块是try-catch结构中的一部分,必须紧跟在try块之后,不能单独使用,在二者之间也不能插入其他语句。但是在一个try-catch结构中,可以只有try块而无catch块。即在本函数中只检查而不处理,把catch处理块放在其他函数中。
(3) try和catch块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句,也不能省略花括号。
(4) 一个try-catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配。
(5) catch后面的圆括号中,一般只写异常信息的类型名,如
catch(double)
catch只检查所捕获异常信息的类型,而不检查它们的值。因此如果需要检测多个不同的异常信息,应当由throw抛出不同类型的异常信息。
异常信息可以是C++系统预定义的标准类型,也可以是用户自定义的类型(如结构体或类)。如果由throw抛出的信息属于该类型或其子类型,则catch与throw二者匹配,catch捕获该异常信息。
catch还可以有另外一种写法,即除了指定类型名外,还指定变量名,如
catch(double d)
此时如果throw抛出的异常信息是double型的变量a,则catch在捕获异常信息a的同时,还使d获得a的值,或者说d得到a的一个拷贝。什么时候需要这样做呢?有时希望在捕获异常信息时,还能利用throw抛出的值,如
catch(double d)
{cout<<″throw ″<<d;}
这时会输出d的值(也就是a值)。当抛出的是类对象时,有时希望在catch块中显示该对象中的某些信息。这时就需要在catch的参数中写出变量名(类对象名)。
(6) 如果在catch子句中没有指定异常信息的类型,而用了删节号“…”,则表示它可以捕捉任何类型的异常信息,如
catch(…) {cout<<″OK″<<endl;}
它能捕捉所有类型的异常信息,并输出″OK″。
这种catch子句应放在trycatch结构中的最后,相当于“其他”。如果把它作为第一个catch子句,则后面的catch子句都不起作用。
(7) trycatch结构可以与throw出现在同一个函数中,也可以不在同一函数中。当throw抛出异常信息后,首先在本函数中寻找与之匹配的catch,如果在本函数中无trycatch结构或找不到与之匹配的catch,就转到离开出现异常最近的trycatch结构去处理。
(8) 在某些情况下,在throw语句中可以不包括表达式,如
throw;
表示“我不处理这个异常,请上级处理”。
(9) 如果throw抛出的异常信息找不到与之匹配的catch块,那么系统就会调用一个系统函数terminate,使程序终止运行。
3.命名空间:一个由程序设计者命名的内存区域。
1)使用命名空间的原因:ANSI C++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。
2)在C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句。C++又引入了类作用域。
4.使用命名空间成员的方法
1)命名空间名::命名空间成员名
2)uisng namespace 命名空间名;
5.标准空间命名空间std
6.使用早期的函数库。