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
永远不会进入 __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);
我对管理异常有疑问。在我的代码中,我将 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
永远不会进入 __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);