IOException HResult 可能的值

3

我发现在IO操作中有时会抛出常见的IOException异常。我可以使用Marshal.GetHRForException(Exception e)方法(在这里找到)来确定特定的错误代码。然后,我想重新抛出一个异常,并使用我的应用程序特定的错误代码,以便向用户提供一些有关出错原因的提示。但是我无法找到IOException可能的HResult值列表。

我遇到的另一个问题是,对于不同的HResult代码,根本原因可能是相同的,例如0x8007052E0x80070569都对应于登录失败:未知用户名或错误密码。

我尝试搜索类似“IOException HResult值”的内容,但没有特殊的映射IOException HResult与易读错误的文档(如thisthis)。

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

所以,IOException HResults值的文档在哪里?

1个回答

10
通过使用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。 将其添加到Tools菜单中,是使其随时可用的好方法。 使用Tools + External Tools,Add按钮,Title =“Error lookup”,“Command”= 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未编写的驱动程序生成的。

请注意,这个回答至少是误导性的。截至2012年发布的.NET 4.5版本,Exception.HResult属性的getter现在是公开的,可以直接使用。此外,对GetHRForException()的调用具有通常不希望出现的副作用,因此应避免使用该方法(请参阅https://blogs.msdn.microsoft.com/yizhang/2013/01/18/marshal-gethrforexception-does-more-than-just-get-hr-for-exception/) - Peter Duniho
此外,关于各种 HRESULT 值,您是正确的,即不存在(也不能存在)详尽的值列表。但是,Windows 使用的值已经公开,并且在许多情况下可以被认为是规范的。Microsoft 还通过在此处发布它们使它们有效地成为其“开放规范”的一部分:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/705fb797-2175-4a90-b5a3-3918024b10b8 - Peter Duniho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接