c# - 如何确定 System.IO.IOException 的 HResult?

标签 c# .net exception hresult

System.Exception.HResult 属性受到保护。如何在不诉诸反射或其他丑陋的 hack 的情况下窥视异常并获取 HResult?


情况是这样的:
我想写一个备份工具,它可以打开和读取系统上的文件。 根据 this guidance,我使用 FileAccess.Read 和 FileShare.ReadWrite 打开文件,因为我不在乎文件在我读取时是否打开写入。

在某些情况下,当我正在读取的文件被另一个应用程序打开时,System.IO.FileStream.Read() 方法会抛出 System.IO.IOException,“该进程无法访问该文件,因为另一个进程已锁定文件的一部分”。这是 error 33 ,或者我认为 HResult 0x80070021。 [编辑:我相信这可以在另一个进程调用 LockFileEx 时返回锁定文件中的字节范围。]

我想在遇到此错误时暂停并重试。我认为这是在这里采取的适当行动。如果锁定进程快速释放字节范围锁,那么我可以继续读取文件。

出于这个原因,我如何区分 IOException 和其他异常?我可以想到这些方法:

  • 私有(private)反射(reflection) - 不想那样做。 Perf 会发臭。
  • 调用 Exception.ToString() 并解析字符串。感觉很老套。不适用于 i18n 版本。

我不喜欢这些选项。有没有更好、更简洁的方法?


我只是四处搜索并找到了 System.Runtime.InteropServices.Marshal.GetHRForException .这会返回像 0x80070021 这样的 uint 吗?

最佳答案

对于 .Net Framework 4.5 及更高版本,您可以使用 Exception.HResult 属性:

int hr = ex.HResult;

对于旧版本,您可以使用 Marshal.GetHRForException取回 HResult,但是这个 has significant side-effects and is not recommended :

int hr = Marshal.GetHRForException(ex);

关于c# - 如何确定 System.IO.IOException 的 HResult?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/991537/

相关文章:

c# - 如何使用 EPPLus 库清除 Excel 中的行?

c# - 为什么 EventArgs 不是接口(interface)而是类?

c# - 存储经过良好散列处理的密码及其散列方法是否很危险?

c# - 构建/运行针对已安装 .Net 4 或 .Net 4.5 的 .Net 4 的应用程序之间有什么区别吗?

.net - Mango Update 中新的 WP7 API 列表?

c# - "Dynamically"在 NEST 中创建过滤器

.net - 在 Crystal Reports 中模拟

c# - "using exceptions to control flow"示例

c++ - 在几个地方处理整个异常层次结构的好方法

Delphi TPair 异常