【发布时间】:2010-11-02 18:07:27
【问题描述】:
System.Exception.HResult 属性受到保护。如何在不诉诸反射或其他丑陋黑客的情况下查看异常并获取 HResult?
情况如下:
我想编写一个备份工具,它可以打开和读取系统上的文件。
根据this guidance,我使用 FileAccess.Read 和 FileShare.ReadWrite 打开文件,因为我不在乎文件在读取时是否已打开以进行写入。
在某些情况下,当我正在读取的文件被另一个应用程序打开时,System.IO.FileStream.Read() 方法会抛出 System.IO.IOException,“该进程无法访问该文件,因为另一个进程已锁定文件的一部分”。这是error 33,或者我认为是HResult 0x80070021。 [编辑:我相信当另一个进程调用LockFileEx 锁定文件中的字节范围时,可以返回。]
当我收到此错误时,我想暂停并重试。我认为这是在这里采取的适当行动。如果锁定过程快速释放字节范围锁定,那么我可以继续读取文件。
由于这个原因,我如何将 IOException 与其他异常区分开来?我可以想到这些方法:
- 私人反思 - 不想那样做。性能会发臭。
- 调用 Exception.ToString() 并解析字符串。感觉很hacky。不适用于 i18n 版本。
我不喜欢这些选项。难道没有更好、更清洁的方法吗?
我刚刚四处寻找,发现System.Runtime.InteropServices.Marshal.GetHRForException。这会返回一个像 0x80070021 这样的 uint 吗?
【问题讨论】:
-
> 私人反思 - 不想那样做。性能会发臭。 - 无论如何,异常性能很臭,所以我不会担心性能方面。但是,反射确实需要 FullTrust,它很丑陋,并且不受支持并且容易损坏 - 这就是为什么你不应该这样做。