• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++ 中try finally关键字详解

C++ 中try finally关键字详解

作者:原来... 字体:[增加 减小] 来源:互联网 时间:2017-05-28

原来... 通过本文主要向大家介绍了c++ finally,try finally,python try finally,delphi try finally,try catch finally等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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”);
}
</div>

上面的程序运行结果如下:

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块中”);
}
}
</div>

上面的程序运行结果如下:

hello
__try块中
__finally块中
world
Press any key to continue

以上所述是小编给大家介绍的C++ 中try finally关键字的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++ 中try finally关键字详解

相关文章

  • 2017-05-28关于C++类的成员初始化列表的相关问题
  • 2017-05-28c++ map,mutimap删除问题分析
  • 2017-05-28C语言实现求定积分的方法
  • 2017-05-28C++中可正确获取UTF-8字符长度的函数分享
  • 2017-05-28C++ 中实现把EXCEL的数据导入数据库(ACCESS、MSSQL等)实例代码
  • 2017-05-28详解C语言编程中预处理器的用法
  • 2017-05-28C++之异常处理详解
  • 2017-05-28MFC绘制不规则窗体的方法
  • 2017-05-28C++去除输入行中空白的方法
  • 2017-05-28对C语言中指针的理解与其基础使用实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • VC中SendMessage和PostMessage的区别
    • c++中拷贝构造函数的参数类型必须是引用
    • 如何在TC2.0中调用汇编程序
    • C语言 以字符串的形式读写文件详解及示例代码
    • C++结构体数组详细解析
    • C++中字符串查找操作的两则实例分享
    • C++实现的一个可以写递归lambda的Y函数
    • 12个关于C语言的有趣问答
    • win32 api实现2048游戏示例
    • C++数据结构之实现循环顺序队列

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有