在stats()内部有4 条语句在try 块之外,在下面两条语句完成之前,可能会有异常被抛出
(1) int *pstats = new int[ 4 ];
(2) do_something( pstats );
在语句(1)中,new 表达式可能会失败,如果发生了这样的情况,标准库将产生bad_alloc
标准异常,由于bad_alloc 是在try 块之外被抛出的,所以在stats()中并没有试图要处理它。
于是函数将终止,pstats没有被初始化,stats()中后面的语句也不会被执行,异常机制承接了
控制权,并一直保持直到异常处理完毕。
在语句(2)中,在do_something()中的语句以及在do_something()中被调用的语句
或do_something()函数中被调用的函数所调用的语句等等,都可能会抛出异常,在从
do_something()调用开始的函数调用链返回之前,这个异常可能也可能不会被捕捉到。如
果异常被处理了,那么stats()继续执行,就像什么也没有发生过一样。如果在do_something()
结束之前异常没有被处理,那么stats()也会被终止,因为异常发生在try 块之外。
注意如果size 等于0 ,那么
pstats[ 3 ] = pstats[ 0 ]/size;
将导致一个除以0 的除法,尽管这将导致向pstats[3]赋一个未定义的数据值,但是对于
除以0 并没有标准异常被抛出。
try 块内的三条语句会怎么样呢?不同的行为区别如下,如果在stats()里面sum_it()、
min_val()及max_val()终止之后,被抛出的异常是活动的、有效的,那么系统不是简单地终
止stats(),而是顺序地检查与try 块相关联的catch 子句,试图处理被抛出来的异常,假设
sum_it()抛出如下异常
throw string( "internal error: adump27832" );
则pstats[0]不会被初始化,在try 块中,接下来的两条语句也不会被执行,异常机制意识到
sum_it()是在try 块中被调用的,因而,它将检查相关的两条catch()子句。