SEH 结构化异常

Structured Exception Handling是windows特有的异常处理,SEH包含了两个方面的功能:
? 终止处理
? 异常处理

终止处理:
终止处理确保无论被保护代码是如何退出的,另一个代码块总能被调用和执行:
__try
{
//Guarded Body

}
__finally
{
//Termination handler

}

无论在被保护代码中使用了return还是goto,亦或者longjump(除非调用了ExitProcess, EixtThread, TerminateProcess, TerminateThread),终止处理程序被调用,即__finally代码块都能执行。

不建议在try块中使用break,goto,return,continue,这会损失性能增加代码量

有一种值得注意的情况:
Void foo()
{
__try
{
Bar();
{
__finally
{
}
}

此时如果bar发生了异常,在vista以后的系统上foo里的finally不会默认进行全局展开finally里的代码不会执行,全局展开(全局展开是发生在嵌套出现的try-finally和try-except之间)的触发由下面介绍的except的filter返回值决定

异常处理:
终止处理确保无论被保护代码是如何退出的,另一个代码块总能被调用和执行,而异常处理定义了发生异常后,如何执行我们的自定义动作(如果程序正常执行,那么异常处理程序不会被调用):
__try
{
//Guarded Body

}
__expect (exception filter)
{
//Exception handler

}

注意:任何时候创建一个__try块,后面必须跟一个finally代码块或except代码块。try后绝对不能同时又finally和except,也不能有多个finally或多个except,可以将try-finally和try-except互相嵌套。

不同于上面的终止处理程序,在异常处理程序try中使用return,goto,continue,break并不会导致额外开销

时间: 2024-12-29 02:53:56

SEH 结构化异常的相关文章

windows SEH机构化异常

搞了不短时间的win32开发了,居然SEH结构化异常没啥了解,必须补下课 现在看来,用起来比c++的标准异常处理简单,毕竟是结构化的,不支持面向对象那一套 处理函数的返回值EXCEPTION_CONTINUE_EXECUTION比较有趣,似乎是提供了免费的午餐,让程序出错也继续运行.不过查了一下资料,似乎不推荐这样做,因为是从出错的那句开始继续运行,但是经过编译,优化后的语句,可能完全不会按照你想象的样子运行 另外,用_set_se_translator也可以将SEH异常转为c++标准异常

结构化异常(SEH)简述

/********************************************************************* * Author  : Samson * Date    : 08/04/2014 * Test platform: *              Linux ubuntu 3.2.0-58-generic-pae *              GNU bash, version 4.2.39 * *****************************

第23章 SEH结构化异常处理(1)

23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制:SEH和VEH(WindowsXP以上新引进) (3)结构化异常处理(SEH)是Windows操作系统提供的强大异常处理功能.而Visual C++中的__try{} __finally{}和__try{} __except{}结构本质上是对Windows提供的SEH的封装. 23.1.2 SEH的

第23章 SEH结构化异常处理(2)

23.2 编译器层面对系统SEH机制的封装 23.2.1 扩展的EXCEPTION_REGISTRATION级相关结构:VC_EXCEPTION_REGISTRATION (1)VC_EXCEPTION_REGISTRATION结构 struct VC_EXCEPTION_REGISTRATION { VC_EXCEPTION_REGISTRATION* prev; //前一个结构体的指针 FARPROC handler; //永远指向_exception_handler4回调函数 scopet

第24章 SEH结构化异常处理—异常处理及软件异常

24.1  程序的结构 (1)try/except框架 __try{ //被保护的代码块 …… } __except(except fileter/*异常过滤程序*/){ //异常处理程序 } (2)说明 ①当__try块中的代码发生异常时,__except()中的过滤程序就被调用. ②过滤程序可以是一个简单的表达式或一个函数(返回值应为EXCEPTION_CONTINUE_SEARCH.EXCEPT_CONTINUE_EXECUTE或EXCEPT_EXECUTE_HANDLER之一) ③过滤表

结构化异常SEH处理机制详细介绍(二)

本文将全面阐述__try,__except,__finally,__leave异常模型机制,它也即是Windows系列操作系统平台上提供的SEH模型.SEH实际包含两个主要功能:结束处理(termination handling)和异常处理(exception handling).每当你建立一个try块,它必须跟随一个finally块或一个except块.一个try 块之后不能既有finally块又有except块.但可以在try - except块中嵌套try - finally块,反过来也可

第25章 SEH结构化异常处理_未处理异常及向量化异常

25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID lpfnEntryPoint) //参数为线程函数的入口地址 { DWORD retValue; DWORD currentESP; DWORD exceptionCode; currentESP = ESP; //lpfnEntryPoint被try/except封装着,这是系统安装的默认的异常

Windows内核读书笔记——SEH结构化异常处理

SEH是对windows系统中的异常分发和处理机制的总称,其实现分布在很多不同的模块中. SEH提供了终结处理和异常处理两种功能. 终结处理保证终结处理块中的程序一定会被执行 1 __try 2 { 3 //要保护的代码 4 } 5 __finally 6 { 7 //终结处理块 8 } 退出保护块的方式:正常结束和非正常结束两种 1.正常结束 正常执行并顺序进入终结处理块称为正常结束 2.非正常结束 因为发生异常或是因为return.goto.break.continue等流程控制语句而离开被

深入研究 Win32 结构化异常处理(作者博客有许多SEH的研究文章)

摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的最基本概念讲起. Matt Pietrek 著董岩 译Victor 转载自 Xfocus 并整理 在所有 Win32 操作系统提供的机制中,使用最广泛的未公开的机制恐怕就要数结构化异常处理(structured exception handling,SEH)了.一提到结构化异常处理,可能就会令人想起