-终止处理程序
结构化异常处理的好处是,写代码时,先集中精力完成正常流程。将功能处理,异常处理分开。
进入,离开异常处理代码块时,编译器须生成一些特殊代码,产生一些关于支持SEH的数据结构表,提供回调函数,其它。
不同编译器对SEH的实现不尽相同,本章采用Microsoft Visual C++编译器规定的用法。
C++异常处理:catch,throw。
和结构化异常处理形式不同。
SEH:
终止处理
异常处理
-终止处理
不管被保护代码如何退出,终止处理程序总被调用,执行。
__try
{
}
__finally
{
}
使用SEH时,代码执行与操作系统和编译器紧密相关,和CPU体系结构也相关。
ExitThread,ExitProcess,TerminateThread,TerminateProcess导致的进程,线程终止,finally代码块不会执行。
使用范例:
DWORD Funcarama4()
{
HANDLE hFile = INVALID_HANDLE_VALUE;
PVOID pvBuf = NULL;
BOOL bFunctionOK = FALSE;
__try
{
DWORD dwNumBytesRead;
BOOL bOK;
hFile = CreateFile(
TEXT("SOMEDATA.DAT"),
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL
);
IF(hFile == INVALID_HANDLE_VALUE)
{
__leave;
}
pvBuf = VirtualAlloc(
NULL,
1024,
MEM_COMMIT,
PAGE_READWRITE);
if(pvBuf == NULL)
{
__leave;
}
...
bFunctionOK = TRUE;
}
__finally
{
if(pvBuf != NULL)
{
VirtualFree(
pvBuf,
MEM_RELEASE | MEM_DECOMMIT);
}
if(hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
}
}
return bFunctionOK;
}
可在finally块调用
// TRUE __try提前退出
BOOL AbnormalTermination();