Windows 95 、 Windows 98 和 Windows 2000(以前的Windows NT)支持一种健壮的处理程序异常的方法,称之为"结构化异常处理(SEH)",这种方法与操作系统密切相关,同时直接在编程语言中被支持。
[微软编译器特定]语法:
try-except语句:
__try
{
//程序代码
}
__except(表达式)
{
//程序代码
}
try-except和try-finally语句是微软对标准C语言的扩充以使应用程序能在程序出现异常后,正确处理异常。
异常(exception)是打乱程序正常运行的一个意外事件。异常分为硬件触发异常和软件触发异常。硬件异常通常包括字运算的被零除与溢出。 软件异常则包括那些藉由调用RaiseException功能产生的自定义异常和一些被Windows检测到的特殊情况(如内存I/O非法操作等)。
通过结构化异常处理,我们可以写出更加可靠的程序代码,藉由简洁的结构化代码处理程序产生的异常,而不是使用使人迷茫的goto语句或是频繁地检测函数的返回值,以确保诸如内存块,文件之类的程序资源在程序意外终止时能够被安全处理,同时还要处理像内存不足这类的特殊问题。
有二种结构化异常处理机制:
异常处理程序,响应异常并消除异常
终止处理程序, 当发生过程被迫终止异常时处理善后事宜
这两种处理方式是截然不同的, 然而在称之为"恢复堆栈"的过程上他们密切相关。当一个异常发生的时候, Windows寻找离异常发生点最近的有效异常处理程序。这个处理程序能够做三件事情中的一件:
A.无法识别异常,把控制权移交其他异常处理程序。
B.识别但是忽略异常,移交控制权。
C.识别并处理异常,使程序恢复运行或安全结束。
能够识别异常的处理程序可能并不在异常发生的函数中,某些情况下它可能在堆栈的更高层(程序代码的更外层)。在处理异常的过程时,堆栈被"复位",被终止函数的局部变量被清除(除非它是一个static静态变量)。
当堆栈复位时,操作系统调用每个函数所有的终止处理函数。终止处理程序让你有一个机会可以清除在被迫终止而无法被正确释放的资源,如使异常线程离开临界区。若程序被迫将要终止,则可进行些类似于清除临时文件的善后处理措施。
注意
结构化异常处理同时也适用于C++代码。 然而,它并不是为C++特别设计的。 虽然使用编译器开关/EHsc能使在C++中使用结构化异常处理时调用本地对象的析构函数, 但是使用标准C++异常处理可以使程序更具有可移植性。由于标准C++能够处理任何类型的异常,使用C++的异常处理机制更具有灵活性。
关于结构化异常处理的C语言模块和C++异常处理的C++模块的混合使用,参见"SEH与C++异常处理的区别"。