正常情况下退出 __try { } 块中的代码时,都会执行 __finally { } 块中的代码。
但是如果在 __try { } 块中调用结束线程或进程的代码(如exit, _exit, _endthread, _endthreadex,... 等)时,则不会执行__finally { } 块中的代码。
SEH_try_finally.cpp 示例代码如下:
#include <stdio.h>
#include <process.h>
#include <windows.h>
unsigned __stdcall seh_try_finnaly_test(void* args) {
__try {
printf("thread __try { } block\n");
_endthreadex(0);
}
__finally {
printf("thread __finally { } block\n");
}
return 0;
}
int main()
{
HANDLE hThread;
unsigned threadID;
// Create thread.
hThread = (HANDLE)_beginthreadex(NULL, 0, &seh_try_finnaly_test, NULL, 0, &threadID);
// Wait until thread terminates.
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
__try {
printf("main __try {} block\n");
exit(0);
}
__finally {
printf("main __finally {} block\n");
}
return 0;
}
输出结果:
thread __try { } block
main __try {} block
可见上面 __finally { } 块中的代码在这种情况下并没有执行。
如果 __try {} 和 __finally { } 中同时包含return语句,则函数的返回值为 __finally { } 中return语句的返回值。例如下面函数的返回值为1。
int test_return() {
__try {
return 0;
}
__finally {
return 1;
}
}