如何从CloseHandle()中捕获异常

Eta*_*tan 6 c++ exception-handling

从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"));
}
Run Code Online (Sandbox Code Playgroud)

我从调试器中得到以下两个错误:

第一次机会异常:0xC0000008:指定了无效句柄.

未捕获的异常:0xC0000008:指定了无效的句柄.

我认为第一次机会异常是正常的,因为它会在catch语句获取之前被触发.然而,未被捕获的异常使我想知道这里究竟是什么问题.

new*_*gre 9

您有两种选择:

选项1:
使用SEH,你需要写这样的东西:

__try
{
  // closeHandle
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
  // print
}
Run Code Online (Sandbox Code Playgroud)

选项2:
使用编译器开关/ EHa,它将指示编译器发出代码,允许您通过C++样式异常处理来处理SEH异常:

try
{
 // close handle
}
catch (...)
{
  // print
}
Run Code Online (Sandbox Code Playgroud)

编辑:
请注意,CloseHandle()如果调试器附加到您的进程,则仅引发异常.从文档:

如果应用程序在调试器下运行,则该函数在收到无效的句柄值或伪句柄值时将抛出异常.