C - Windows 异常处理程序无效句柄

C - Windows Exception Handler Invalid Handle

我对管理异常有疑问。在我的代码中,我将 hIn = INVALID_HANDLE_VALUE 用于测试异常,而 "null" 是一个不存在的文件。我的一段代码是

__try
      {
             hIn = CreateFile (_T("null"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
             hIn = INVALID_HANDLE_VALUE;
             ReadFile (hIn, buffer, BUF_SIZE*sizeof(DWORD), &nIn, NULL);
      }
    __except(GetExceptionCode() == EXCEPTION_INVALID_HANDLE ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
      {
          _tprintf (_T("-> Error OPENING FILE <-\n"));
          return -1;
      }

我不明白为什么它没有捕捉到异常。问题是什么? 提前谢谢你

C 函数 (Win32 API) ReadFile() 通常不会抛出异常。而是检查 ReadFile 的 return 值,如果 FALSE,调用 GetLastError() 获取错误代码。

顺便说一句,您是否启用了 SEH?请参阅编译器开关 /EHsc

see

永远不会进入 __except 块,因为 ReadFile 不会抛出异常。

请记住,Windows API 与编程语言无关,需要提供任何编程语言都可以使用的接口。并非所有语言都支持异常,甚至那些使用不同机制的语言也是如此。所以对于像 Windows API 这样的 API,抛出异常根本不是一个选项。

您问题中的两个 API 调用均通过其 return 值指示错误。您需要检查这些 return 值并采取相应措施。并非所有函数都以相同的方式报告错误,因此您需要密切关注您调用的每个 API 函数的文档。

正如其他人所说,您的 __except 没有捕获到异常,因为首先没有引发异常。您需要改为检查 return 值和错误代码:

hIn = CreateFile (_T("null"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hIn == INVALID_HANDLE_VALUE)
{
    _tprintf (_T("-> Error %u OPENING FILE <-\n"), GetLastError());
    return -1;
}
...
ReadFile (hIn, buffer, BUF_SIZE*sizeof(DWORD), &nIn, NULL);
...
CloseHandle(hIn);