Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to catch exception from CloseHandle()

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: 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.

like image 577
Etan Avatar asked Oct 11 '09 09:10

Etan


2 Answers

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.

like image 113
newgre Avatar answered Oct 26 '22 13:10

newgre


I guess MSDN is talking about SEH exceptions, which are not the same as C++ exceptions.

Related MSDN page

like image 44
Pierre Bourdon Avatar answered Oct 26 '22 12:10

Pierre Bourdon