当前位置:
文档之家› SEH(结构化异常处理)PPT课件
SEH(结构化异常处理)PPT课件
-
10
SEH实际包含两个主要功能:
• 结束处理( termination handling )
• 异常处理( exception handling )
-
11
结束处理
一个结束处理程序能够确保去调用和执行一个代 码块(结束处理程序,termination handler),而不 管另外一段代码(保护体,guarded body)是如何退 出的。结束处理程序的文法结构(使用微软的Visual C++编译程序)如下:
// 直接跳出当前的__try作用域 __leave;
程序中利用__leave关键
p = 0;
字,在执行错误语句p=0;
*p = 25; } __finally {
*p=25;之前,马上离开当前 的__try块作用域 ,避免了“ 局部展开” 的额外开销 。
puts("__finally块中"); } puts("world"); }
壮。
-
6
使用SEH的好处就是当你编 写程序时,只需要关注程序要完 成的任务。如果在运行时发生什 么错误,系统会发现并将发生的 问题通知你。这样的分离,可以 使你集中精力处理眼前的工作, 而将可能发生的错误放在后面处 理。
-
7
我们虽然都知道,SEH是 Windows系列操作系统平台提供 的一种非常完善的异常处理机制。 但这毕竟有些过于抽象了,对于 程序员而言,它应该有一套类似 于像C++中那样的try,catch,throw 等几个关键字组成的完整的异常 处理模型。
• goto语句或return语句引发的程序控制流离 开当前__try块作用域时,系统自动完成对 __finally块代码的调用
• 由于在__try块中出现异常时,导致程序控 制流离开当前__try块作用域,这种情况下 也是由系统自动完成对__finally块的调用
-
15
无论是第2种,还是第3种情 况,毫无疑问,它们都会引起很 大的系统开销,编译器在编译此 类程序代码时,它会为这两种情 况准备很多的额外代码。
-
8
SHE确实也有类似的语法,它由 如下几个关键字组成: __try __except __finally __leave
-
9
注意!
不要将结构化异常处理同C++的异常 处理相混淆。C++异常处理是一种不同形 式的异常处理,其形式是使用C++关键字 catch和throw。微软的Visual C++支持 C++的异常处理,并且在内部实现上利用 了已经引入到编译程序和Windows操作系 统的结构化异常处理的功能。
-
3
在许多系统中,编程语言所 提供的异常处理机制的实现,都 是建立在操作系统中所提供的异 常处理机制之上,如Windows平 台上的VC编译器所实现的C++异 常处理模型,它就是建立在SEH 机制之上的 。具体关系图如下:
-
4
-
5
因此,操作系统平台中所提供的异 常处理机制是非常有必要的。而且,异 常处理机制的实现也是操作系统设计时 的一个重要课题。微软在Windows中引 入SEH的主要动机是为了便于操作系统 本身的开发。操作系统的开发人员使用 SEH,使得系统更加强壮。我们也可以 使用SEH,使我们的自己的程序更加强
-
13
来看一个简单的程序:
#include <stdio.h> void main() { puts("hello"); __try { puts("__try块中");
程序运行结果如下: hello __try块中 __finally块中 Press any key to continue
// 注意,下面return语句直接让函数返
来看一个简单的例子:
-
17
#include <stdio.h> void main() { puts("hello");
程序运行结果如下: hello __try块中
__try
__finally块中
{ int* p; puts("__try块中");
world Press any key to continue
一般第2种情况,被称为 “局部展开”;第3种情况,被 称为“全局展员完全可以有效地 避免它,避免“局部展开”引起的不必要的 额外开销。在一个函数中,可能有多处的 return语句。针对这种情况,SEH提供了一种 非常有效的折衷方案,那就是__leave关键字 所起的作用,它既具有像goto语句和return语 句那样类似的作用(由于检测到某个程序运 行中的错误,需要马上离开当前的__try块作 用域),但是又避免了“局部展开” 的额外 开销。
建议大家在编程时不妨多 用__leave关键字来提高程序 的性能。
-
18
结束处理小结:
• 1、 “不管在何种情况下,在离开当前的作用 域时,finally块区域内的代码都将会被执行到”, 这是核心法则。
-
12
__ try和__ finally关键字用来标出 结束处理程序两段代码的轮廓。在上面 的代码段中,操作系统和编译程序共同 来确保结束处理程序中的__ finally代码 块能够被执行,不管保护体(__try块) 是如何退出的。不论你在保护体中用 return,还是goto,或者是longjump, 结束处理程序(__finally块)都将被调 用。
SEH(结构化异常处理)
-
1
SEH
(“Structured Exception Handling”),
即结构化异常处理.是Windows 操作系统提供给程序设计者的强 有力的处理程序错误或异常的武 器。
-
2
大家都知道,在C++中有较 完善的异常处理机制,同样在C 语言中也有很不错的异常处理机 制来支持。那么为什么现在此处 还在讨论操作系统平台中所提供 的异常处理机制呢?
回了 return;
由此可见:
} __finally {
不管在何种情况下,在离 开当前的作用域__finally
puts("__finally块中"); } puts("world");
块区域内的代码都将会被 执行到
}
-
14
__finally块被执行的流程,无外乎三种情况:
• 顺序执行到__finally块区域内的代码,这种 情况很简单,容易理解