2

我发现有时在IO操作中会抛出常见的IOException。我可以使用Marshal.GetHRForException(Exception e)方法(在此处找到)来确定具体的错误代码。在那之后,我想重新抛出一个异常,使用我的应用程序特定的错误代码,以便给用户一些提示出了什么问题。但我无法找到IOException的可能HResult值列表列表。

我坚持的另一件事是,对于不同的HResult代码,根本原因可能是相同的 - 例如,0x8007052E0x80070569都对应于Logon failure: unknown user name or bad password.

我试图搜索“IOException HResult 值”之类的东西,但是将 IOException HResult 映射到人类可读的错误(如thisthis)并没有什么特别之处。

我也在这里看到了这个问题,非常相似,但仍然没有解决方案。

那么,关于 IOException HResults 值的文档在哪里?

4

1 回答 1

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 没有“异常规范”,MSDN 文档中仅列出了特定 winapi 函数的最常见错误代码。很像 .NET 异常。一个必要的邪恶,许多 IOException 错误代码是由不是由 Microsoft 编写的驱动程序生成的。

于 2014-09-09T08:57:15.433 回答