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

细说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则提供了相应的源代码。 立即下载

相关推荐

基于FastLIO2与TEB算法的机器狗自主导航系统实战

本文详细介绍了如何为机器狗构建一套基于FastLIO2与TEB算法的自主导航系统。通过整合FastLIO2激光惯性里程计实现精准定位,并采用TEB局部规划器进行灵活路径规划与动态避障,解决了传统方案在复杂地形下反应慢、易碰撞的问题。文章提供了从环境搭建、算法部署、地图转换到系统调试的完整实战指南,帮助开发者实现机器狗的稳健自主行走。

beer8的博客 321

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

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

dvlinker的技术专栏 5万+

手把手教你用单结晶体管搭建简易振荡电路(含电路图和波形分析)

本文详细介绍了如何使用单结晶体管(UJT)搭建简易振荡电路,包括电路设计、波形分析和实战技巧。通过具体的电路图和参数计算,帮助电子爱好者和工程师快速掌握UJT振荡器的设计与调试方法,适用于脉冲信号生成和时钟源制作等应用场景。

weixin_29207533的博客 516

结构化异常处理

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

abs240306的博客 279

光伏发电系统模拟及其发电预测开源python工具pvlib

本文介绍光伏发电系统模拟及其发电预测开源python工具pvlib,以及举例介绍获取辐照度方法、光伏发电预测思路。

肖永威的专栏 1万+

Rijndael密码算法

一 什么是Rijndael Rijndael是由比利时密码学家设计的分组密码算法,于2000年被选为新一代的标准密码算法——AES。今后会有越来越多的密码软件支持这种算法。 Rijndael的分组长度和密钥长度可以分别以32比特为单位在128比特和256比特的范围内进行选择。不过在AES的规格中,分组长度固定为128比特,密钥长度只有128、192和256比特三种。 二 Rijndael的加...

实践求真知 1万+

C++结构化异常处理

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

天道酬勤 1550

别再凭感觉选电容了!手把手教你计算电机控制器里的母线电容(附Excel计算工具)

本文详细解析了电机控制器中母线电容的选型方法,从理论计算到工程实践,帮助工程师避免常见误区。通过精确计算纹波电压、电容容量等关键参数,并结合薄膜电容与电解电容的性能对比,提供实用的选型建议。附带的Excel计算工具可快速完成参数计算,适用于工业伺服驱动和电动车电机控制器设计。

weixin_28720573的博客 521

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

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

tanliyoung的专栏 795

碎碎念android eMMC【转】

本文转载自:https://blog.youkuaiyun.com/Fybon/article/details/44242549 一、/dev/blockroot@:/dev/block #lsbootdevicemmcblk0mmcblk0p1mmcblk0p10…….mmcblk0p18mmcblk0p19mmcblk0p2mmcblk0p20……mmcblk0p29mmcblk0p3mmcblk0p3...

zzb2760715357的博客 377

【可信数据空间-部署方案】

此部署架构体现了以下几个核心原则:去中心化: 数据存储和处理完全分布在各个参与者端,运营方只提供核心的协调和信任基础设施。安全边界清晰: 通过VPC、DMZ、防火墙、K8s命名空间等技术,在每个层级都建立了严格的安全边界。高可用与弹性: 所有关键服务均以集群方式部署,避免单点故障,并能根据负载动态伸缩。云原生: 全面采用容器化和Kubernetes编排,简化部署、管理和运维复杂度。合规性: 架构设计天然满足数据驻留要求(数据留在企业本地),并为所有操作提供不可篡改的审计追踪能力。

u014716614的博客 771

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

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

LPWSTR的博客 756

手把手完整实现STM32+LORA组网网关+机智云平台+手机APP应用———第一节- 一主多从的LORA本地组网通信-实现从机采集温湿度与主机显示数据

本教程为《手把手实现STM32+LORA组网网关+机智云平台+手机APP应用》第一节。实现一个主机,两个从机的LORA组网通信。两个从机采集温湿度数据并通过LORA传输数据到主机,然后主机接收到两个从机数据后进行数据显示,本节通过PC串口助手显示两个从机的数据。 下一节将其主机接收的数据通过WIFI网关(ESP8266)传到机智云平台与手机APP。 本文讲解一主多从的LORA本地组网通信,串口助手进行数据展示。使用硬件主要包括:STM32F103C8T6最小系统板(3个)、正点原子LORA模块ATK-L

嵌入式阿齐Archie 1万+

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

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

LPWSTR的博客 817

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

hexiaomin_1984的专栏 388

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Prompt设计

什么是prompt,以及代码演示

2501_91557123的博客 333

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

概要: 本文承接上一篇名为“非结构化异常处理--具有非结构化异常处理的计算器”的博客。本文将计算器的代码用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、付费专栏及课程。

余额充值