time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > C\C++\VC > C++基础 > 第25集 SEH的综合

第25集 SEH的综合

时间:2009-12-04 22:56 点击:662次 字体:[ ]




  SEH模型主要包括try-except异常处理机制和try-finally结束处理机制,而且这两者能够很好地有机统一起来,它们结合使用时,能够提供给程序员非常强大、非常灵活的控制手段。其实这在上一篇文章中的几个例子中已经使用到,这里将继续进行系统的介绍,特别是try-except和try-finally结合使用时的一些细节问题。

  try-except和try-finally组合使用

  try-except和try-finally可以组合起来使用,它们可以是平行线性的关系,也可以是嵌套的关系。而且不仅是try-except语句中可以嵌套try-finally语句;同时try-finally语句中也可以嵌套try-except语句。所以它们的使用起来非常灵活,请看下面的代码:

  // 例程1,try-except语句与try-finally语句平行关系

  #include

  void main()

  {

  puts("hello");

  __try

  {

  int* p;

  puts("__try块中");

  // 下面抛出一个异常

  p = 0;

  *p = 25;

  }

  __except(1)

  {

  puts("__except块中");

  }

  __try

  {

  }

  __finally

  {

  puts("__finally块中");

  }

  puts("world");

  }

  // 例程2,try-except语句中嵌套try-finally

  #include

  void main()

  {

  puts("hello");

  __try

  {

  __try

  {

  int* p;

  puts("__try块中");

  // 下面抛出一个异常

  p = 0;

  *p = 25;

  }

  __finally

  {

  // 这里会被执行吗

  puts("__finally块中");

  }

  }

  __except(1)

  {

  puts("__except块中");

  }

  puts("world");

  }

  // 例程3,try-finally语句中嵌套try-except

  #include

  void main()

  {

  puts("hello");

  __try

  {

  __try

  {

  int* p;

  puts("__try块中");

  // 下面抛出一个异常

  p = 0;

  *p = 25;

  }

  __except(1)

  {

  puts("__except块中");

  }

  }

  __finally

  {

  puts("__finally块中");

  }

  puts("world");

  }

  try-except和try-finally组合使用时,需注意的事情

  在C++异常模型中,一个try block块可以拥有多个catch block块相对应,但是在SEH模型中,一个__try块只能是拥有一个__except块或一个__finally块相对应,例如下面的程序代码片断是存在语法错误的。

  // 例程1,一个__try块,两个__except块

  #include

  void main()

  {

  puts("hello");

  __try

  {

  int* p;

  puts("__try块中");

  // 下面抛出一个异常

  p = 0;

  *p = 25;

  }

  __except(1)

  {

  puts("__except块中");

  }

  // 这里有语法错误

  __except(1)

  {

  puts("__except块中");

  }

  puts("world");

  }

  // 例程2,一个__try块,两个__finally块

  #include

  void main()

  {

  puts("hello");

  __try

  {

  puts("__try块中");

  }

  __finally

  {

  puts("__finally块中");

  }

  // 这里有语法错误

  __finally

  {

  puts("__finally块中");

  }

  puts("world");

  }

  // 例程3,一个__try块,对应一个__finally块和一个__except块

  #include

  void main()

  {

  puts("hello");

  __try

  {

  int* p;

  puts("__try块中");

  // 下面抛出一个异常

  p = 0;

  *p = 25;

  }

  __finally

  {

  puts("__finally块中");

  }

  // 这里有语法错误

  __except(1)

  {

  puts("__except块中");

  }

  puts("world");

  }

  温过而知新

  这里给出最后一个简单的try-except和try-finally相结合的例子,让我们温过而知新。代码如下(这是MSDN中的例程):

  #include "stdio.h"

  void test()

  {

  int* p = 0x00000000; // pointer to NULL

  __try

  {

  puts("in try");

  __try

  {

  puts("in try");

  // causes an access violation exception;

  // 导致一个存储异常

  *p = 13;

  // 呵呵,注意这条语句

  puts("这里不会被执行到");

  }

  __finally

  {

  puts("in finally");

  }

  // 呵呵,注意这条语句

  puts("这里也不会被执行到");

  }

  __except(puts("in filter 1"), 0)

  {

  puts("in except 1");

  }

  }

  void main()

  {

  puts("hello");

  __try

  {

  test();

  }

  __except(puts("in filter 2"), 1)

  {

  puts("in except 2");

  }

  puts("world");

  }

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

  hello

  in try

  in try

  in filter 1

  in filter 2

  in finally

  in except 2

  world

  Press any key to continue

  下面用图表描述一下上面例程运行时的执行流程,如下图所示。

   第25集 SEH的综合_www.fengfly.com

  总结

  (1) try-except和try-finally可以组合起来使用,它们可以是平行线性的关系,也可以是嵌套的关系。而且不仅是try-except语句中可以嵌套try-finally语句;同时try-finally语句中也可以嵌套try-except语句。

  (2) 一个__try块只能是拥有一个__except块或一个__finally块相对应。

  至此,关于SEH的__try、__except、__finally、__leave模型已经基本阐述完毕,但是主人公阿愚认为,有关SEH模型机制,还有一个非常关键的内容没有阐述到,那就是SEH与C++异常处理模型可以结合使用吗?如果可以的话?它们组合使用时,有什么限制吗?或带来什么不良后果吗?

  大家知道,Windows平台提供的SEH机制虽然主要是应用于C语言的程序,以便第三厂商开发出高效的设备驱动程序来。但是__try、__except、__finally、__leave模型同样也可以在C++程序中使用,这在MSDN中已经提到,虽然微软还是建议,在C++程序中尽量采用C++的异常处理模型。

  但是对于广大程序员而言,大家有必要知道,__try、__except、__finally、__leave模型在C++程序中使用时的一些限制。下一篇文章中,阿愚将把自己总结的一些经验和体会与大家一块分享。去看看吧!GO!



本文地址 : http://www.fengfly.com/plus/view-159882-1.html
标签: puts __finally Entry
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: