C++异常与结构化异常SEH的比较

结构化异常处理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 核心编程(第五版)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值