2009-10-11 7 views
6

À partir de la spécification MSDN, CloseHandle lève une exception si un handle non valide lui est transmis lorsqu'il s'exécute sous un débogueur.Comment faire pour attraper l'exception de CloseHandle()

Depuis que je veux avoir du code propre, j'ai inséré du code pour l'attraper. Cependant, cela ne fonctionne pas, l'exception n'est pas prise en compte.

#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")); 
} 

Je reçois les deux erreurs du débogueur suivantes:

exception Première chance: 0xC0000008: Une poignée non valide a été spécifiée.

Exception non interceptée: 0xC0000008: un handle non valide a été spécifié.

Je pense que l'exception de la première chance est normale, car elle est déclenchée avant que l'instruction catch ne l'obtienne. Cependant, l'exception non interceptée me fait me demander ce qui ne va pas ici.

Répondre

8

Vous avez deux options:

Option 1:
Utilisez SEH, vous avez besoin d'écrire quelque chose comme ceci:

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

Option 2:
Utilisez le commutateur du compilateur/EHa, qui instruira le compilateur à Emmit le code qui vous permettra de gérer exception SEH par style C++ gestion des exceptions:

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

Edit:
Notez que CloseHandle() ne fait que soulever une exception si un débogueur est attaché à votre processus. De la documentation:

Si l'application est en cours d'exécution sous un débogueur, la fonction lancer une exception si elle reçoit soit une valeur de poignée qui n'est pas valide ou une valeur-handle pseudo.

+1

Si cette exception est toujours levée, même si vous avez __try/__ sauf, vous avez probablement activé cette exception. Aller au menu Déboguer/Exceptions/Win32 Exceptions et désactiver l'option c0000008 Un handle non valide a été spécifié. Après avoir interrompu OK pour Visual Studio, arrêtez. – user720594

2

Je suppose que MSDN parle d'exceptions SEH, qui ne sont pas les mêmes que les exceptions C++.

Related MSDN page

+0

merci! Quel est le chemin à parcourir pour obtenir le texte "Un handle invalide a été spécifié."? 0xC0000008 peut être obtenu via GetExceptionCode() – Etan

+1

Vous pouvez essayer la fonction FormatMessage, mais je ne suis pas sûr de celui-là: http://msdn.microsoft.com/en-us/library/ms679351(VS.85) .aspx –

Questions connexes