try exception

 每当你建立一个t r y块,它必须跟随一个f i n a l l y块或一个e x c e p t块。一
个try 块之后不能既有f i n a l l y块又有e x c e p t块。但可以在t r y - e x c e p t块中嵌套t r y - f i n a l l y块,反过来
也可以。

与结束处理程序(前一章讨论过)不同,异常过滤器( exception filter)和异常处理程序
是通过操作系统直接执行的,编译程序在计算异常过滤器表达式和执行异常处理程序方面不做
什么事。

尽管在结束处理程序的t r y块中使用r e t u r n、g o t o、c o n t i n u e和b r e a k语句遭到强烈地反对,但
在异常处理程序的t r y块中使用这些语句不会产生速度和代码规模方面的不良影响。这样的语句
出现在与e x c e p t块相结合的t r y块中不会引起局部展开的系统开销。

 

程序中注释的标号给出了执行的次序

try exception_第1张图片

通过在f i n a l l y块里放入一个r e t u r n语句,可以阻止系统去完成一个全局展开。

在F u n c P h e a s a n t的t r y块中,当调用s t r c p y函数时,会引发一个内存存取异常。当异常发生
时,系统开始查看是否有一个过滤器可以处理这个异常。系统会发现在F u n c M o n k e y中的异常
过滤器是处理这个异常的,并且系统开始一个全局展开。
全局展开启动,先执行F u n c P h e a s a n t的f i n a l l y块中的代码。这个代码块包含一个r e t u r n语句。
这个r e t u r n语句使系统停止做展开, F u n c P h e a s a n t将实际返回到F u n c F i s h。然后F u n c F i s h又返回
到函数F u n c M o n k e y。F u n c M o n k e y中的代码继续执行,调用M e s s a g e B o x。
注意F u n c M o n k e y的异常块中的代码从不会执行对M e s s a g e B e e p的调用。F u n c P h e a s a n t的
f i n a l l y块中的r e t u r n语句使系统完全停止了展开,继续执行,就像什么也没有发生。
微软专门设计S E H按这种方式工作。程序员有可能希望使展开停止,让代码继续执行下去。
这种方法为程序员提供了一种手段。原则上,应该小心避免在f i n a l l y块中安排r e t u r n语句。

 

 

你可能感兴趣的:(try exception)