这个SHE的形式不一样

时间:2021-09-05 02:38:52

近期一直被一个问题所困扰,就是写出来的措施老是呈现无故瓦解,有的处所本身知道可能有问题,但是有的处所又根柢没步伐知道有什么问题。更苦逼的工作是,我们的措施是需要7x24处事客户,虽然不需要实时精准零不对,但是总不能呈现断线丢掉数据状态。故恰好通过措置惩罚惩罚该问题,找到了一些解决方案,怎么捕获访谒犯警内存地点或者0除以一个数。从而就遇到了这个布局化异常措置惩罚惩罚,今就简单做个介绍认识下,便利大家遇到相关问题后,首先知道问题原因,再就是如何解决。空话不久不多说,下面进入正题。


什么是布局化异常措置惩罚惩罚

布局化异常措置惩罚惩罚(structured exception handling,下文简称:SEH),是作为一种系统机制引入到操纵系统中的,自己与语言无关。在我们本身的措施中使用SEH可以让我们集中精力开发关键成果,而把措施中所可能呈现的异常进行统一的措置惩罚惩罚,使措施显得越发简洁且增加可读性。

使用SHE,并不意味着可以完全忽略代码中可能呈现的错误,但是我们可以将软件事情流程和软件异常情况措置惩罚惩罚进行分隔,先集中精力干重要且告急的活,再来措置惩罚惩罚这个可能会遇到各类的错误的重要不告急的问题(不告急,但绝对重要)

当在措施中使用SEH时,就酿成编译器相关的。其所造成的承担主要由编译措施来承当,例如编译措施会孕育产生一些表(table)来撑持SEH的数据布局,还会供给回调函数。

注:
不要混淆SHE和C++ 异常措置惩罚惩罚。C++ 异常措置惩罚惩罚再形式上表示为使用关键字catch和throw,这个SHE的形式不一样,再windows Visual C++中,是通过编译器和操纵系统的SHE进行实现的。

在所有 Win32 操纵系统供给的机制中,使用最广泛的未果然的机制恐怕就要数SHE了。一提到SHE,可能就会令人想起 *__try、__finally* 和 *__except* 之类的词儿。SHE实际上包罗两方面的成果:终止措置惩罚惩罚(termination handing)异常措置惩罚惩罚(exception handing)


终止措置惩罚惩罚

终止措置惩罚惩罚措施确保不管一个代码块(被掩护代码)是如何退出的,此外一个代码块(终止措置惩罚惩罚措施)总是能被挪用和执行,其语法如下:

__try { //Guarded body //... } __finally { //Terimnation handler //... }

**__try__finally** 关键字符号了终止措置惩罚惩罚措施的两个部分。操纵系统和编译器的协同事情保障了不管掩护代码部分是如何退出的(无论是正常退出、还是异常退出)终止措施城市被挪用,即**__finally**代码块都能执行。


try块的正常退出与非正常退出

try块可能会因为return,goto,异常等非自然退出,也可能会因为告成执行而自然退出。但岂论try块是如何退出的,finally块的内容城市被执行。

int Func1() { cout << __FUNCTION__ << endl; int nTemp = 0; __try{ //正常执行 nTemp = 22; cout << "nTemp = " << nTemp << endl; } __finally{ //结束措置惩罚惩罚 cout << "finally nTemp = " << nTemp << endl; } return nTemp; } int Func2() { cout << __FUNCTION__ << endl; int nTemp = 0; __try{ //非正常执行 return 0; nTemp = 22; cout << "nTemp = " << nTemp << endl; } __finally{ //结束措置惩罚惩罚 cout << "finally nTemp = " << nTemp << endl; } return nTemp; }

功效如下:

Func1 nTemp = 22 //正常执行赋值 finally nTemp = 22 //结束措置惩罚惩罚块执行 Func2 finally nTemp = 0 //结束措置惩罚惩罚块执行

以上实例可以看出,通过使用终止措置惩罚惩罚措施可以防备过早执行return语句,当return语句视图退出try块的时候,编译器会让finally代码块再它之前执行。对付在多线程编程中通过信号量访谒变量时,呈现异常情况,能顺利是否信号量,这样线程就不会一直占用一个信号量。当finally代码块执行完后,函数就返回了。

为了让整个机制运行起来,编译器必需生成一些特别代码,而系统也必需执行一些特别事情,所以应该在写代码的时候制止再try代码块中使用return语句,因为对应用措施性能有影响,对付简单demo问题不大,对付要永劫间不间断运行的措施还是悠着点好,下文会提到一个关键字**__leave**关键字,它可以辅佐我们发明有局部展开开销的代码。

一条好的经验法例:不要再终止措置惩罚惩罚措施中包罗让try块提前退出的语句,这意味着从try块和finally块中移除return,continue,break,goto等语句,把这些语句放在终止措置惩罚惩罚措施以外。这样做的好处就是不用去捕获哪些try块中的提前退出,从而时编译器生成的代码量最小,提高措施的运行效率和代码可读性。


####finally块的清理成果及对措施布局的影响