我发现有时在 IO 操作中会抛出常见的IOException。我可以使用Marshal.GetHRForException(Exception e)方法(找到here)来确定具体的错误代码。之后,我想使用我的应用程序特定的错误代码重新抛出异常,以便向用户提供一些错误的提示。但我无法找到IOException可能的 HResult 值列表。
我坚持的另一件事是,对于不同的 HResult 代码,根本原因可能相同 - 例如, 0x8007052E 和 0x80070569 - 两者都对应Logon failure: unknown user name or bad password.
我试图搜索“IOException HResult values”之类的内容,但是没有什么特别的可以将IOException HResult映射到人类可读的错误(如this或this)。
我在这里也看到了question,它非常相似,但仍然没有解决方案。
那么,有关IOException HResults值的文档在哪里?
答案 0 :(得分:9)
通过使用Marshal.GetHRForException(),您将Windows错误代码包装到HResult错误代码中。对于IOException,它始终是Windows错误号+ 0x80070000。 " 8"意味着错误," 7"意味着它来自Windows。您只需使用& 0xffff
再次恢复原始错误代码即可。
将结果转换回十进制数,您将有很多地方可以找出错误代码的含义。我个人总是使用WinError.h SDK头文件。取决于你拥有的VS版本,大多数程序员会在C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.1A \ Include目录中找到它。
您还有一个方便的实用程序,从Visual Studio命令提示符运行errlook.exe。让它随时可用的一种好方法是将其添加到“工具”菜单中。使用工具+外部工具,添加按钮,标题="错误查找","命令" = C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ Tools \ errlook.exe。根据需要调整路径以匹配您的VS版本。
您现在还发现错误代码不一样。 0x80070569& 0xffff = 0x569 = 1385.在WinError.h中搜索该错误代码会产生ERROR_LOGON_TYPE_NOT_GRANTED,"登录失败:用户未在此计算机上被授予请求的登录类型"。
您可以获得的IOException错误类型无论如何都不受限制。 Windows没有"异常规范",只有最常见的错误代码在特定winapi函数的MSDN文档中列出。很像.NET异常。必要的恶意,许多IOException错误代码是由非Microsoft编写的驱动程序生成的。