【问题标题】:How to catch exception from CloseHandle()如何从 CloseHandle() 中捕获异常
【发布时间】:2009-10-11 09:59:27
【问题描述】:

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

我从调试器中得到以下两个错误:

第一次机会异常:0xC0000008:指定的句柄无效。

未捕获的异常:0xC0000008:指定的句柄无效。

我认为第一次机会异常是正常的,因为它在 catch 语句应该得到它之前就被触发了。但是,未捕获的异常让我想知道这里到底出了什么问题。

【问题讨论】:

    标签: c++ exception-handling


    【解决方案1】:

    你有两个选择:

    选项 1:
    使用 SEH,需要这样写:

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

    选项 2:
    使用编译器开关 /EHa,它将指示编译器发出代码,这将允许您通过 C++ 样式的异常处理来处理 SEH 异常:

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

    编辑:
    请注意,CloseHandle() 仅在将调试器附加到您的进程时才会引发异常。 来自文档:

    如果应用程序在调试器下运行,该函数将 如果接收到的句柄值不是 有效或伪句柄值。

    【讨论】:

    • 如果它仍然抛出这个异常,即使你有__try/__except,你可能已经启用了这个异常的中断。转到菜单 Debug/Exceptions/Win32 Exceptions 并禁用选项 c0000008 指定了无效句柄。在 OK 中断到 Visual Studio 后应该停止。
    【解决方案2】:

    我猜 MSDN 说的是 SEH 异常,它与 C++ 异常不同。

    Related MSDN page

    【讨论】:

    猜你喜欢
    • 2018-07-14
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2010-12-27
    相关资源
    最近更新 更多