2009-10-11 51 views
6

从MSDN规范开始,CloseHandle如果在调试器下运行无效句柄时会抛出异常。如何从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语句应该得到它之前被触发。然而,未捕获的异常让我想知道这里实际上是错误的。

回答

8

你有两个选择:

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

__try 
{ 
    // closeHandle 
} 
__except(EXCEPTION_EXECUTE_HANDLER) 
{ 
    // print 
} 

选项2:
使用编译器开关/ EHa,它将指示编译器到emmit代码,这将允许您通过C++风格的异常处理处理SEH例外:

try 
{ 
// close handle 
} 
catch (...) 
{ 
    // print 
} 

编辑:
注意CloseHandle()只有一个调试器附加到你的进程会引发异常。 从文档:

如果应用程序在调试器下运行,如果它收到无论是句柄值不是 有效或伪句柄值的函数将 抛出异常。

+1

如果它仍然引发此异常,即使您有__try/__除外,您可能已打开此异常。转到菜单Debug/Exceptions/Win32 Exceptions并禁用选项c0000008指定了无效句柄。确定打破Visual Studio后应停止。 – user720594 2012-07-04 10:11:11

2

我想MSDN正在讨论SEH异常,这与C++异常不一样。

Related MSDN page

+0

谢谢!获取文本“指定了无效句柄”的方法是什么? 0xC0000008可以通过GetExceptionCode() – Etan 2009-10-11 10:28:01

+1

得到你可以尝试FormatMessage函数,但我不确定那个:http://msdn.microsoft.com/en-us/library/ms679351(VS.85) .aspx – 2009-10-11 10:31:57