C++面向对象程序设计(谭浩强)阅读笔记5——C++工具

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) trycatch块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句,也不能省略花括号。

(4) 一个try-catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配。

(5) catch后面的圆括号中,一般只写异常信息的类型名,如

catch(double)

catch只检查所捕获异常信息的类型,而不检查它们的值。因此如果需要检测多个不同的异常信息,应当由throw抛出不同类型的异常信息。

异常信息可以是C++系统预定义的标准类型,也可以是用户自定义的类型(如结构体或类)。如果由throw抛出的信息属于该类型或其子类型,则catchthrow二者匹配,catch捕获该异常信息。

catch还可以有另外一种写法,即除了指定类型名外,还指定变量名,如

catch(double d)

此时如果throw抛出的异常信息是double型的变量a,则catch在捕获异常信息a的同时,还使d获得a的值,或者说d得到a的一个拷贝。什么时候需要这样做呢?有时希望在捕获异常信息时,还能利用throw抛出的值,如

catch(double d)

  {cout<<″throw ″<

这时会输出d的值(也就是a)。当抛出的是类对象时,有时希望在catch块中显示该对象中的某些信息。这时就需要在catch的参数中写出变量名(类对象名)

(6) 如果在catch子句中没有指定异常信息的类型,而用了删节号“…”,则表示它可以捕捉任何类型的异常信息,如

catch(…) {cout<<″OK″<

它能捕捉所有类型的异常信息,并输出″OK″

这种catch子句应放在trycatch结构中的最后,相当于其他。如果把它作为第一个catch子句,则后面的catch子句都不起作用。

(7) trycatch结构可以与throw出现在同一个函数中,也可以不在同一函数中。当throw抛出异常信息后,首先在本函数中寻找与之匹配的catch,如果在本函数中无trycatch结构或找不到与之匹配的catch,就转到离开出现异常最近的trycatch结构去处理。

(8) 在某些情况下,在throw语句中可以不包括表达式,如

throw;

表示我不处理这个异常,请上级处理

(9) 如果throw抛出的异常信息找不到与之匹配的catch块,那么系统就会调用一个系统函数terminate,使程序终止运行。


3.命名空间:一个由程序设计者命名的内存区域。

1)使用命名空间的原因:ANSI C++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。

2)在C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句。C++又引入了类作用域。

4.使用命名空间成员的方法

1)命名空间名::命名空间成员名

2)uisng namespace 命名空间名;

5.标准空间命名空间std

6.使用早期的函数库。

你可能感兴趣的:(C++基础)