从MSDN规范开始,如果在调试器下运行时向其传递了无效句柄,CloseHandle
将抛出异常。
因为我想要干净的代码,所以我插入了一些代码来捕获它。但是,它不起作用,例外没有被捕获。
#include <windows.h>
#include <tchar.h>
#include <exception>
/* omitted code */
CloseHandle(myHandle); // close the handle, the handle is now invalid
try {
success = CloseHandle(myHandle);
} catch (std::exception& e) {
_tprintf(TEXT("%s\n"), e.what());
} catch (...) {
_tprintf(TEXT("UNKNOWN\n"));
}
我从调试器中得到以下两个错误:
第一次机会异常:0xC0000008:指定了无效句柄。
未捕获的异常:0xC0000008:指定了无效的句柄。
我认为第一次机会异常是正常的,因为它会在catch语句获取之前被触发。然而,未被捕获的例外让我想知道这里究竟出了什么问题。
答案 0 :(得分:9)
您有两种选择:
选项1:
使用SEH,你需要写这样的东西:
__try
{
// closeHandle
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
// print
}
选项2:
使用编译器开关/ EHa,它将指示编译器发出代码,允许您通过C ++样式异常处理来处理SEH异常:
try
{
// close handle
}
catch (...)
{
// print
}
修改强>
请注意,CloseHandle()
仅在调试程序附加到您的进程时才会引发异常。
来自文档:
如果应用程序在调试器下运行,则该函数将执行 如果收到的句柄值不是,则抛出异常 有效或伪句柄值。
答案 1 :(得分:2)
我想MSDN正在谈论SEH异常,它与C ++异常不同。