如何从CloseHandle()中捕获异常

时间:2009-10-11 09:59:27

标签: 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"));
}

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

  

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

     

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

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

2 个答案:

答案 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 ++异常不同。

Related MSDN page