基于异常的设计(2)

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

在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()子句。

你可能感兴趣的:(活动)