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/