异常处理(五、结构化异常处理)

细说windows的异常处理和实现——结构化异常 C++里面有使用异常处理的机制,但是那些需要throw catch捕捉等操作 而通常一个win程序,我们会因为各种原因导致其crash,而不一定是throw 了某个exception。我们需要这样一个机制,可以在程序因为各种原因crash时掌握程序的情况,并能够做点事情,这就是所谓的“优雅的结束”。win api恰为我们提供了这样一个函数SetUnhandledExceptionFilt 阅读详情

结构化异常处理(Structured Exception Handling,简称SEH)是微软针对Windows程序异常处理进行的扩展,在Visual C++中,它同时支持C和C++语言。SEH不宜与标准C++异常处理和MFC异常处理混用,对于C++程序,微软建议使用标准C++的异常处理。

  为了支持SEH,Visual C++中定义了四个关键字(由于这些关键字是非标准关键字,其它编译器不一定支持),用以扩展C 和C++语言:

  (1)__except

  (2)__finally

  (3)__leave

  (4)__try

  其基本语法为:
CODE:
--------------------------------------------------------------------------------

__try
{
...//可能导致异常的被监控代码块
}
__except(filter-expression)
{
...//异常处理函数
}
  或:
CODE: 
--------------------------------------------------------------------------------

__try
{
...
}
__finally
{
...//终止
}
其执行的步骤如下:

  (1)__try块被执行;

  (2)如果__try块没有出现异常,则执行到__except块之后;否则,执行到__except块,根据filter-expression的值决定异常处理方法:

  a. filter-expression的值为EXCEPTION_CONTINUE_EXECUTION (-1)

  恢复异常,从发生异常处下面开始执行,异常处理函数本身不被执行;

  b. filter-expression的值为EXCEPTION_CONTINUE_SEARCH (0)

  异常不被识别,拒绝捕获异常,继续搜索下一个异常处理函数;

  c. filter-expression的值为EXCEPTION_EXECUTE_HANDLER (1)

  异常被识别,终止异常,从异常发生处开始退栈,一路上遇到的终止函数都被执行。

  看看这个例子:
CODE:
--------------------------------------------------------------------------------

#include "stdio.h"

void main()
{
 int* p = NULL; // 定义一个空指针
 puts("SEH begin");
 __try
 {
  puts("in try");
  __try
  {
   puts("in try");
   *p = 0; // 引发一个内存访问异常
  }
  __finally
  {
   puts("in finally");
  }
 }
 __except(puts("in filter"), 1)
 {
  puts("in except");
 }
 puts("SEH end");
}

  程序的输出为:

SEH begin
in try //执行__try块
in try //执行嵌入的__try块
in filter //执行filter-expression,返回EXCEPTION_EXECUTE_HANDLER
in finally //展开嵌入的__finally
in except //执行对应的__except块
SEH end //处理完毕
  如果我们把__except(puts("in filter"), 1)改为__except(puts("in filter"), 0),程序的输出将变为:
CODE: 
--------------------------------------------------------------------------------

SEH begin
in try //执行__try块
in try //执行嵌入的__try块
in filter //执行filter-expression,返回EXCEPTION_CONTINUE_SEARCH
in finally //展开嵌入的__finally
  程序的执行也告崩溃,弹出对话框。

要想这个程序能正确地执行,我们可以在第一个__try块的外面再套一个__try块和一个接收filter-expression返回值为EXCEPTION_EXECUTE_HANDLER的__except块,程序改为:
CODE: 
--------------------------------------------------------------------------------

#include "stdio.h"

void main()
{
 int* p = NULL; // 定义一个空指针
 puts("SEH begin");
 __try
 {
  __try
  {
   puts("in try");
   __try
   {
    puts("in try");
    *p = 0; // 引发一个内存访问异常
   }
   __finally
   {
    puts("in finally");
   }
  }
  __except(puts("in filter"), 0)
  {
   puts("in except");
  }
 }
 __except(puts("in filter"), 1)
 {
  puts("in except");
 }
 puts("SEH end");
}

  程序输出:

SEH begin
in try //执行__try块
in try //执行嵌入的__try块
in filter1 //执行filter-expression,返回EXCEPTION_CONTINUE_SEARCH
in filter2 //执行filter-expression,返回EXCEPTION_EXECUTE_HANDLER
in finally //展开嵌入的__finally
in except2 //执行对应的__except块
SEH end //处理完毕
  由此可以看出,因为第一个__except的filter-expression返回EXCEPTION_CONTINUE_SEARCH 的原因,"in except1"没有被输出。程序之所以没有崩溃,是因为最终碰到了接收EXCEPTION_EXECUTE_HANDLER的第2个__except。

  SEH使用复杂的地方在于较难控制异常处理的流动方向,弄不好程序就"挂"了。如果把例4-1中的__except(puts("in filter"), 1)改为__except(puts("in filter"), -1),程序会进入一个死循环,输出:
CODE: 
--------------------------------------------------------------------------------

SEH begin
in try //执行__try块
in try //执行嵌入的__try块
in filter //执行filter-expression,返回EXCEPTION_CONTINUE_EXECUTION
in filter
in filter
in filter
in filter
…//疯狂输出"in filter"
  最后疯狂地输出"in filter",我们把断点设置在__except(puts("in filter"), -1)语句之前,按F5会不断进入此断点。


本文来自优快云博客,转载出处:http://blog.youkuaiyun.com/gabazi/archive/2005/11/17/531971.aspx

深入解析结构化异常处理(SEH中文).docx 在Win32操作系统提供的所有功能中,使用最广泛而又没有公开的恐怕要数结构化异常处理(Structured Exception Handling,SEH) 了。现在Microsoft仍然没有提供这些源代码,它提供的是编译过的目标文件,而Borland则提供了相应的源代码。 立即下载

相关推荐

24届-Python面经(华为OD)

【摘要】24届非科班生通过栗栗姐指导成功转行华为OD。从4月4日零基础准备,经历机考(4/18)、测评(4/19)、资格面(5/7)、技术面(5/9-11)到5月17日获offer。全程栗栗姐提供题库、面经指导和实时跟进。虽遇压力面和技术短板,但在专业辅导下10天走完全流程。案例证明转行需自身努力+优质HR支持,栗栗姐团队提供多岗位(Java/Python等)、多地域(北上深等)OD机会,含笔试资料和全流程攻略。

2401_86909848的博客 1188

深入解析结构化异常处理(SEH) - by Matt Pietrek

深入解析结构化异常处理(SEH) - by Matt Pietrek

dvlinker的技术专栏 5万+

UEC++ 虚幻5笔记(数字孪生示例) day13

文件读取与写入,数字孪生入门制作

qq_44924388的博客 3843

结构化异常处理

学习目标: 了解异常处理的基本知识 掌握如何抛出和捕获异常 理解嵌套try语句使用 了解掌握异常类 理解finally块 异常处理的基本知识 结构化异常处理测试特定的代码段,并在发生异常处理时改变错误情况或意外行为。 抛出和捕获异常 抛出和捕获异常是由try/catch/finally语句处理的,是异常处理的主要机制。 在C#处理异常时,需要在代码块中关注两个部分:一...

abs240306的博客 279

Visual Studio Code 打开java项目

在 Visual Studio Code 中打开并运行一个 Java 项目之前,你需要确保你已经完成了一些初始设置。

2674

数电-基于FPGA的自动售货控制系统设计

本次数电的课程设计是设计一款基于FPGA的自动售货控制系统,因为手上暂时没有FPGA的板子,所以先采用proteus仿真进行设计,观察系统效果,等之后FPGA板子下发,再移到quartus上调试和下载。同样是自己第一次自主设计电路系统,可能在功能上不完整或者逻辑上有错误,大家多多包涵,欢迎沟通交流。

gg1067的博客 2293

C++结构化异常处理

什么是结构化异常处理 结构化异常处理(SEH)是C语言的Microsoft扩展,可以处理各种硬件或软件异常,由于只支持Windows,所以不具备可移植性。 try-except语句 __try { // guarded code } __except ( expression ) { // exception handler code } try-except语句可以使被保护的代...

天道酬勤 1550

Elsevier期刊LaTeX双栏模板(cas-dc)实战:从Overleaf配置到投稿全流程

本文详细介绍了Elsevier期刊LaTeX双栏模板(cas-dc)在Overleaf平台上的配置与使用全流程,包括模板结构解析、标题与作者信息规范、摘要与关键词特殊格式、正文写作技巧、参考文献管理以及投稿前检查清单。特别针对Elsevier期刊投稿需求,提供了从模板安装到最终投稿的实用指南,帮助研究者高效完成论文排版工作。

weixin_28455801的博客 1323

Windows 系统编程初探 (五)结构化异常处理之二:线程相关异常处理

 Windows 系统编程初探 (五)结构化异常处理之二:线程相关异常处理         通过前面的例子我们可以看出,所谓异常处理就是在异常处理函数中分析系统传递给它的参数,根据其中的信息做出相应的反应,是不是和消息循环很像呢?确实很像,因为它们都是 M$ 制造。下面开始看一下线程相关异常处理。 线程相关异常处理只会对指定的线程进行监视。我仍旧按照前面的模式来讲述它的实现。同

tanliyoung的专栏 795

基于FME—三调篇—尖锐角及小缝隙处理

1 问题分析: 该功能实现在FME较为简单,相对ARCGIS模型构建器以及ARCGIS ENGINE,FME更适合无代码基础的人群。在三调内业数据处理要求中,尖锐角是不允许存在的。本文基于FME实现了对尖锐角的自动查询与消除以及自动处理在消除尖锐角过程中产生的缝隙,并进行了拓扑检查,实现自动化批量处理尖锐角的功能,提高工作效率。 2 总体思路: 2.1 实现功能分析: 1.找出小于指定角度的尖锐角...

qq_33315579的博客 9181

全国30米分辨率逐年植被覆盖度(FVC)数据集

植被覆盖度是描述地表植被的重要参数与生态环境的基本指标,在大气圈、土壤圈、水圈和生物圈中都占据着重要的地位,区域及全球范围的植被覆盖度估算对植被及相关领域的研究具有重要意义。分别对LANDSAT 5/7/8系列数据计算FVC,其中Landsat5 和Landsat 7NDVI计算利用 B4和B3波段,Landsat8 和Landsat9 NDVI计算利用 B5和B4波段。算法从当年所有观测数据中,以低云、低探测角度和最高NDVI值为标准,选择最佳的可用像元值,并进行换算。(3) FVC的计算。

地球资源数据云的官方博客 1808

Visual C++异常处理机制原理与应用(五)——C/C++结构化异常处理之try-except异常处理的使用(下)

在前面几篇文章中,我们介绍了VC++结构化异常处理的相关内容,目前其用途仅限于捕获代码中本来就存在的异常,比如访问违规、除数为0等异常情况。其实在很多场合,我们也完全可以利用这种机制,触发一个异常,然后让执行流程转入异常处理阶段。

LPWSTR的博客 756

大红球预警版-精选+自定义板块监控

这是一款简单易用的股票大单资金监控插件,兼容通达信软件,可嵌入分时图或定制版面。它以红绿圆球直观显示主力买卖情况(红球为买,绿球为卖),支持300万以上大单语音播报。插件提供实时资金流向分析、多股同时监控、自定义预警条件等功能,无需L2账号。用户可自由切换图形/列表模式,监控特定板块,并配合幻影软件实现自动交易。虽然上涨股通常红球占优,但需结合其他指标综合判断。该插件完全免费,包含详细视频教程,适合新手使用。

guleba的博客 1794

Windows异常世界历险记(五)——VC6中结构化异常处理机制的反汇编分析(下)

在本系列的上一篇文章windows异常世界历险记(四)——VC6中结构化异常处理机制的反汇编分析(中)中,给出了针对VC6的异常处理机制进行逆向后得到的伪码。在本文中,我们仍然以之前写的小程序为例,通过调试的方式结合我们得到的VC6结构化异常处理的伪码,对其运行机制进行分析。

LPWSTR的博客 817

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

《Windows核心编程》读书笔记(11…

前段时间阅读完了《Windows核心编程》的第三、第四和第五部分。    第三部分和第四部分是关于Windows内存管理以及动态链接库原理的,这一部分对于了解Windows工作原理是非常重要的。尤其是虚拟内存的使用以及DLL原理,在开发中经常使用。不过,由于之前对这一部分的了解不是很深,加之代码实践的比较少,对这一部分的掌握主要还在原理层面。我想以后还会继续对这方面进行研究的。   第五部分结构化

hexiaomin_1984的专栏 388

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Prompt设计

什么是prompt,以及代码演示

2501_91557123的博客 333

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

结构化异常处理--具有结构化异常处理的计算器

概要: 本文承接上一篇名为“非结构化异常处理--具有非结构化异常处理的计算器”的博客。本文将计算器的代码用VB.NET语句写一个具有结构化异常处理的简单计算器,主要介绍VB.NET中的结构化异常处理的知识。 确定按钮的代码: Private Sub Button16_Click(ByVal sender As System.Object, ByVal e As System.Event

庞凡 坚定自己踏实走好每一步 1965

结构化异常处理SEH

结构化异常处理(seh)(Z)毕业的事情终于要搞定了,几个月前就答应要写这么一个文章,现在补上.结构化异常处理是一种操作系统提供的机制, 用来优化程序的结构,提供更加健壮的程序执行环境.试想想你写程序不用考虑哪里有个内存访问错误,哪里有个空指针等等一类的错误,一直按照程序的逻辑结构 向下写,而不用去检查函数是否成功,这会是多么愉悦的事情(这个乃是seh的宣传词,不代表我的观点,这里

rageliu的专栏 1294

SEH结构化异常处理

千言万语从何说起呢?嗯,还是先说说SEH的特点吧:SEH的优点在于当你编写代码的时候,可以集中注意力完成任务,如果在运行的时候出现了问题,系统会捕获到错误并且通知你出了问题.使得SEH工作的任务主要落在编译器而不是操作系统上.当进入,退出异常块时候,你的编译器必须产生特殊的代码.编译器必须产生处理SEH的数据结构,还必须提供操作系统能调用的回调函数来使得异常块能被遍历.编译器还负责准备栈框

anikan_yu的专栏 2678

非结构化异常处理-具有非结构化异常处理的计算器

概要 本文主要用VB.NET语句写一个具有非结构化异常处理的简单计算器,主要介绍VB.NET中的非结构化异常处理的知识。 计算器界面              计算器简单描述         单击数字和运算符输入公式。其中单击运算符按钮时,文本框Text属性中连接一个空格,然后连接“运算符”按钮的Text属性,在连接一个按钮。这样子“计算”按钮的click事件中,通过查找空格的位置,

庞凡 坚定自己踏实走好每一步 2528

Windows核心编程:结构化异常处理

 作者:shenzi链接:http://blog.youkuaiyun.com/shenzi Windows核心编程:结构化异常处理     结构化异常处理(structured exception handling,SEH)带来的好处是我们在写代码时,可以先集中精力完成软件的正常工作流程。如果在运行的时候出现了什么问题,系统

shenzi的天空 3777
上一篇: 异常处理(六、各种异常处理的对比)
下一篇: 异常处理(四、MFC异常处理)
fairy_study
博客等级 码龄18年 29粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值