As of the MSDN spec, CloseHandle
throws an Exception if an invalid handle is passed to it when it runs under a debugger.
Since I want to have clean code, I've inserted some code to catch it. However, it doesn't work, the exception gets uncaught.
#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"));
}
I get the following two errors from the debugger:
First-chance exception开发者_StackOverflow: 0xC0000008: An invalid handle was specified.
Uncaught exception: 0xC0000008: An invalid handle was specified.
I think that the first-chance exception is normal, since it gets fired before the catch statement should get it. However, the uncaught exception makes me wondering what's actually wrong here.
You have two options:
Option 1:
Use SEH, you need to write something like this:
__try
{
// closeHandle
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
// print
}
Option 2:
Use the compiler switch /EHa, which will instruct the compiler to emmit code which will allow you to handle SEH exception via C++ style exception handling:
try
{
// close handle
}
catch (...)
{
// print
}
Edit:
Note that CloseHandle()
only raises an exception if a debugger is attached to your process.
From the documentation:
If the application is running under a debugger, the function will throw an exception if it receives either a handle value that is not valid or a pseudo-handle value.
I guess MSDN is talking about SEH exceptions, which are not the same as C++ exceptions.
Related MSDN page
精彩评论