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

时间:2015-06-05 12:47:20

标签: c windows winapi exception exception-handling

我遇到了管理例外的问题。在我的代码中,我输入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;
      }

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

3 个答案:

答案 0 :(得分:1)

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

你有没有启用SEH?请参阅编译器开关/ EHsc

see

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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);