C++ 关键字 (try-finally) 收藏
try-finally语句是Microsoft对C和C++语言的扩展,它能使32位的目标程序在异常出现时,有效保证一些资源能够被及时清除,这些资源的清除任务可以包括例如内存的释放,文件的关闭,文件句柄的释放等等。try-finally语句特别适合这样的情况下使用,例如一个例程(函数)中,有几个地方需要检测一个错误,并且在错误出现时,函数可能提前返回。

#include <windows.h>
#include <stdio.h>

try-finally语句的语法与try-except很类似,稍有不同的是,__finally后面没有一个表达式,这是因为try- finally语句的作用不是用于异常处理,所以它不需要一个表达式来判断当前异常错误的种类。另外,与try-except语句类似,try- finally也可以是多层嵌套的,并且一个函数内可以有多个try-finally语句,不管它是嵌套的,或是平行的。当然,try-finally多层嵌套也可以是跨函数的。这里不一一列出示例,大家可以自己测试一番。
另外,对于上面示例程序的运行结果,是不是觉得有点意料之外呢?因为 __finally块中的put(“__finally块中”)语句也被执行了。是的,没错!这就是try-finally语句最具有魔幻能力的地方,即 “不管在何种情况下,在离开当前的作用域时,finally块区域内的代码都将会被执行到”。呵呵!这的确是很厉害吧!为了验证这条规则,下面来看一个更典型示例,代码如下:

#include <stdio.h>

void main()
{
puts(“hello”);
__try
{
puts(“__try块中”);

// 注意,下面return语句直接让函数返回了
return;
}
__finally
{
puts(“__finally块中”);
}

puts(“world”);
}

上面的程序运行结果如下:
hello
__try块中
__finally块中
Press any key to continue

void main()
{
puts(“hello”);
__try
{
puts(“__try块中”);
}
// 注意,这里不是__except块,而是__finally取代
__finally
{
puts(“__finally块中”);
}

puts(“world”);
}

上面的程序运行结果如下:
hello
__try块中
__finally块中
world
Press any key to continue

总结__finally块被执行的流程时,无外乎三种情况。第一种就是顺序执行到__finally块区域内的代码,这种情况很简单,容易理解;第二种就是goto语句或return语句引发的程序控制流离开当前__try块作用域时,系统自动完成对__finally块代码的调用;第三种就是由于在__try块中出现异常时,导致程序控制流离开当前__try块作用域,这种情况下也是由系统自动完成对__finally块的调用。无论是第 2种,还是第3种情况,毫无疑问,它们都会引起很大的系统开销,编译器在编译此类程序代码时,它会为这两种情况准备很多的额外代码。一般第2种情况,被称为“局部展开(LocalUnwinding)”;第3种情况,被称为“全局展开(GlobalUnwinding)”。在后面阐述SEH实现的时候会详细分析到这一点。
第3种情况,也即由于出现异常而导致的“全局展开”,对于程序员而言,这也许是无法避免的,因为你在利用异常处理机制提高程序可靠健壮性的同时,不可避免的会引起性能上其它的一些开销。呵呵!这世界其实也算瞒公平的,有得必有失。

  但是,对于第2种情况,程序员完全可以有效地避免它,避免“局部展开”引起的不必要的额外开销。实际这也是与结构化程序设计思想相一致的,也即一个程序模块应该只有一个入口和一个出口,程序模块内尽量避免使用goto语句等。但是,话虽如此,有时为了提高程序的可读性,程序员在编写代码时,有时可能不得不采用一些与结构化程序设计思想相悖的做法,例如,在一个函数中,可能有多处的return语句。针对这种情况,SEH提供了一种非常有效的折衷方案,那就是__leave关键字所起的作用,它既具有像goto语句和return语句那样类似的作用(由于检测到某个程序运行中的错误,需要马上离开当前的 __try块作用域),但是又避免了“局部展开” 的额外开销。还是看个例子吧!代码如下:

#include <stdio.h>

void test()
{
puts(“hello”);
__try
{
int* p;
puts(“__try块中”);

// 直接跳出当前的__try作用域
__leave;
p = 0;
*p = 25;
}
__finally
{
// 这里会被执行吗?当然
puts(“__finally块中”);
}

puts(“world”);
}

void main()
{
__try
{
test();
}
__except(1)
{
puts(“__except块中”);
}
}

上面的程序运行结果如下:
hello
__try块中
__finally块中
world
Press any key to continue

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lvwenshuai/archive/2011/01/25/6163342.aspx

C++ 关键字 (try-finally) 收藏相关推荐

  1. 制造业ERP怎么创新与转型(阿朱说)

    昨天有个ERP实施顾问写了篇文章叫<再见吧,咨询>,觉得ERP顾问的精力和时间效率都被表里不一的企业内斗消磨了.ERP理论不适合流程制造行业.ERP顾问生活太苦.云计算和SaaS后让ERP ...

  2. 整理推荐比较好用的具有书签搜索功能的chrome插件

    平时在整理学习chrome插件的过程中,经常会去试用各种大家推荐的插件.在去年我们的一篇文章:推荐六款好用的书签收藏夹剪藏型管理插件.这里面介绍的是收藏书签的插件.而随着我们使用chrome越来越频繁 ...

  3. thickbox 应用

    发表时间:2009-01-13 关键字: thickbox 引用 收藏 相关文章: * 在网上收集的一些很有用的小工具     * 『提问』struts 验证失败,转发的时候,出现url错误?     ...

  4. 基于java+ssm的音乐信息网站-计算机毕业设计

    项目介绍 本音乐网站是针对目前音乐网站管理的实际需求,从实际工作出发,对过去的音乐网站管理系统存在的问题进行分析,结合计算机系统的结构.概念.模型.原理.方法,在计算机各种优势的情况下,采用目前最流行 ...

  5. 在ultraedit查找每行第二个单词_新手收藏!亚马逊关键字查找

    亚马逊销售中最重要的是"排名".而"关键字"对提高排名很重要.搜索结果对亚马逊的销售产生重大影响.要想让你的产品被显示在搜索结果的顶部,那你必须选择有效的关键字 ...

  6. char* 赋值 const char* 释放_C/C++编程笔记:C语言中 const 关键字的作用及解析,值得收藏!...

    有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小. 为了满足这一要求,可以使用const关键字对变量加以限定: c ...

  7. 富文本关键字搜索高亮,解决方法及优化(收藏!)

    大厂技术  高级前端  Node进阶 点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 作者:猿猴望月 原文:https://juejin.cn/post/707068849792 ...

  8. java的static关键字

    java的static关键字 静态变量和静态方法 static关键字最基本的用法是: 1.被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来 2.被static ...

  9. 3000 字详解 Pandas 数据查询,建议收藏

    作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编来和大家说一说怎么从DataFrame数据集中筛选符合指定条件的数据,希望会对读者朋友有所帮助. 导入数据集和模块 我们先导入pandas模块, ...

最新文章

  1. python元组转字典_python中怎么将元组、字典转化为列表
  2. Redis 高可用篇:你管这叫主从架构数据同步原理?
  3. python Gevent – 高性能的Python并发框架
  4. JQuery 获取节点
  5. docker中部署Nginx
  6. PyCharm的structure自动定位到相应的函数位置
  7. sql运算符_SQL AND运算符解释语法示例
  8. API接口应该如何设计?
  9. forEach,for in,for of循环的用法
  10. Python算法实现 -- K最短路径算法
  11. directx修复工具v3.2增强版_「电脑知识」USBOS 超级PE启动维护工具增强版及标准版...
  12. 【一起学习输入法】华宇拼音输入法开源版本解析(1)
  13. matlab 多项式排序,MATLAB多项式
  14. 今年本人英语六级分数剖析
  15. 东北大学秦皇岛分校计算机类排名,东北大学秦皇岛分校全国排名,2021东北大学秦皇岛分校排名榜...
  16. PHP 阿里云短信接口调用及检测验证码
  17. PowerPC指令集结构之同步指令:Sync和Isync
  18. 【CS231n】十五、深度学习的高效算法和硬件设计_一只神秘的大金毛_新浪博客...
  19. PTA(3)--Emergency
  20. CSS-三栏布局新手上路

热门文章

  1. User.find_each
  2. 基础练习 Huffuman树 (优先队列)
  3. 第K极值(Tyvj)
  4. Ubuntu下串口通信之cutecom
  5. [LGP4707] 重返现世
  6. 你知道CSS实现水平垂直居中的第10种方式吗?
  7. 数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)
  8. UNIX 环境高级编程 文件和目录
  9. 有关于我的SDL所使用的环境
  10. 海量数据库解决方案2011030401