2009-10-11 11 views
6

istisnası nasıl yakalanır? MSDN belirtimleri nedeniyle, CloseHandle, bir hata ayıklayıcısının altında çalışırken geçersiz bir tanıtıcı geçirilirse bir Özel Durum atar.CloseHandle()

Temiz kod almak istediğim için onu yakalamak için bir kod ekledim. Ancak, işe yaramıyor, istisna yakalanmıyor.

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

ben ayıklananları aşağıdaki iki hata alıyorum:

Birinci şans istisna: 0xC0000008: Geçersiz bir tanıtıcı belirtildi.

Yakalanmamış özel durum: 0xC0000008: Geçersiz bir tanıtıcı belirtildi.

Ben cevap vereyim catch deyimi önce kovuluyor beri ilk şansını istisna normal olduğunu düşünüyorum. Ancak, yakalanmamış istisna burada neyin yanlış olduğunu merak ediyor.

cevap

8

İki seçeneğiniz vardır Derleyiciye talimat verecek olan derleyici anahtarını/EHa'yı kullanın. Eğer C++ tarzı istisna işleme yoluyla SEH istisna idare sağlayacak kodu Emmit için:

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

Düzenleme: Bir ayıklayıcı sizin sürecine bağlı olup olmadığına yalnızca bir özel durum oluşturur
Not CloseHandle() söyledi. belgelerine : geçerli değildir bir sap değeri veya sahte sap değerini ya alırsa

uygulama bir hata ayıklayıcı altında çalışıyorsa, fonksiyon bir özel durum oluşturur.

+1

Yine de bu istisnayı atarsa, __try/__ dışında olsa bile, muhtemelen bu özel durumu ihlal etmeyi etkinleştirdiniz. Debug/Exceptions/Win32 İstisnaları menüsüne gidin ve c0000008 seçeneğini devre dışı bırakın Geçersiz bir tanıtıcı belirtildi. Tamam sonra Visual Studio'ya son vermeli. – user720594

2

MSDN, C++ istisnalarıyla aynı olmayan SEH istisnalarından bahsediyor sanırım.

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

Seçenek 2:

Kullanım SEH, böyle bir şey yazmaya gerek:

Seçenek 1:

Related MSDN page

+0

Teşekkürler! "Geçersiz bir tanıtıcı belirtildi" metnini almanın yolu nedir? 0xC0000008 GetExceptionCode() – Etan

+1

aracılığıyla edinilebilir. FormatMessage işlevini deneyebilirsiniz, ancak bundan emin değilim: http://msdn.microsoft.com/en-us/library/ms679351(VS.85) .aspx –

İlgili konular