博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++异常与结构化异常SEH的比较
阅读量:4166 次
发布时间:2019-05-26

本文共 1263 字,大约阅读时间需要 4 分钟。

结构化异常处理SEH(全称Structured Exception Handling),是Windows操作系统所提供的对错误或异常的处理机制,是Windows操作系统的一个重要组成部分。

Q : 在windows系统中,我们在开发应用程序时应该使用结构化异常还是C++异常?

A : SEH是操作系统所提供的便利,它在任何语言中都可以使用。而C++异常处理只有在编写C++代码时才可以使用。如果读者在开发C++应用程序,那就应该使用C++异常,而不是结构化异常。理由是C++异常是语言的一部分,编译器知道什么是一个C++对象。这也就意味着编译器会自动生成代码来调用C++对象的析构函数,保证对象的释放。

我们应该了解Microsoft 的Visual C++编译器使用操作系统的结构化异常机制来实现C++异常处理机制。所以在创建一个C++ try 块时,编译器会为我们生成一个SEH   __try块。C++的catch语句对应SEH异常过滤程序,catch 块中的代码则对应SEH   __except 块中的代码。而编译器也会为C++ throw语句生成对WindowsRaiseException函数的调用。throw语句所使用的变量则成为RaiseException的附加参数。

 

下面这段代码有助于更清楚地了解整个过程。

//该函数使用C++异常处理

void ChunkyFunky()

{

    try

    {

         // try body

        ....

        throw  5;

    }

   catch( int  x)

  {

     // catch body

     .....

  }

   ....

}

 

//该函数则演示了C++编译器生成的对应的结构化异常处理代码

void ChunkyFunky()

{

  __try

  {

    // try body

     ......

    RaiseException(Code = 0xE06D7363, Flag = EXCEPTION_NONCONTINUABLE, Args = 5);

  }

 __except( (ArgType == Integer) ? EXCEPTION_EXECUTE_HANDLE : EXCEPTION_CONTINUE_SEARCH )

 {

   // catch body

   .....

 }

  .....

}

 

说明:

传给RaiseException 的异常代码为0xE06d7363,这是Visual C++开发组选择用来抛出一个C++异常的软件异常代码。

 

Microsoft   Visual Studio的调试器为异常调试提供了出色的支持。当进程中的某个线程抛出异常,操作系统会马上通知调试器(如果调试器已经附着)。这个通知呗称为“首次机会通知”。调试器将响应这个通知,促使线程寻找异常过滤程序。如果所有的异常过滤程序都返回EXCEPTION_CONTINUE_SEARCH,操作系统会给调试器一个“最后机会通知”。这两个通知的存在使得软件开发人员能更好地控制异常调试的过程。

参考文献:Windows 核心编程(第五版)

转载地址:http://hzlxi.baihongyu.com/

你可能感兴趣的文章
Linux里设置环境变量的方法(export PATH)
查看>>
c语言中strlen所输出的字符长度到底要不要再加1 (指'\0')?
查看>>
C语言双指针的常见用法
查看>>
UBUntu解决fatal error: sqlite3.h: No such file or directory,//原因是系统没有安装函数库
查看>>
String 类 的c_str()函数
查看>>
sysconf()系统函数详解
查看>>
调整内核printk的打印级别(启动脚本中运行 echo 0 4 0 7 > /proc/sys/kernel/printk 关闭所有内核打印)
查看>>
临时关闭打开console办法
查看>>
printf()函数中\t,水平制表符,空格的个数,对齐打印
查看>>
结构体测试用例struct(指针用例)结构体里面含有指向自己的指针怎么用
查看>>
Linux中gmtime和localtime的区别(time_t格式转换为tm格式)
查看>>
如果函数传递的是结构体,小心在调用的参数中给指针重新赋值(拿tm结构体举例)
查看>>
extern用法
查看>>
extern"C"的使用
查看>>
使用nm命令获取linux的可执行文件里或动态库中的所有函数名称
查看>>
关于free命令 内存的详细介绍以及如何手动释放内存
查看>>
Linux使用free命令buff/cache过高
查看>>
如何定义结构体变量及如何使用
查看>>
c语言中 有无bool 这个变量
查看>>
SVN错误:cannot show diff because of inconsistent of newline in the file 的解决方法
查看>>