Eta*_*tan 6 c++ exception-handling
从MSDN规范开始,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"));
}
Run Code Online (Sandbox Code Playgroud)
我从调试器中得到以下两个错误:
第一次机会异常:0xC0000008:指定了无效句柄.
未捕获的异常:0xC0000008:指定了无效的句柄.
我认为第一次机会异常是正常的,因为它会在catch语句获取之前被触发.然而,未被捕获的异常使我想知道这里究竟是什么问题.
您有两种选择:
选项1:
使用SEH,你需要写这样的东西:
__try
{
// closeHandle
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
// print
}
Run Code Online (Sandbox Code Playgroud)
选项2:
使用编译器开关/ EHa,它将指示编译器发出代码,允许您通过C++样式异常处理来处理SEH异常:
try
{
// close handle
}
catch (...)
{
// print
}
Run Code Online (Sandbox Code Playgroud)
编辑:
请注意,CloseHandle()如果调试器附加到您的进程,则仅引发异常.从文档:
如果应用程序在调试器下运行,则该函数在收到无效的句柄值或伪句柄值时将抛出异常.