我遇到了管理例外的问题。在我的代码中,我输入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;
}
我不明白为什么它没有捕获异常。问题是什么? 提前谢谢
答案 0 :(得分:1)
C函数(Win32 API)ReadFile()
通常不会抛出异常。而是检查ReadFile
的返回值,如果 FALSE ,请调用GetLastError()
以获取错误代码。
你有没有启用SEH?请参阅编译器开关/ EHsc
答案 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);