System.Exception.HResult 属性受到保护。如何在不诉诸反射或其他丑陋黑客的情况下查看异常内部并获取 HResult?
情况是这样的:
我想编写一个备份工具,它可以打开并读取系统上的文件。
我使用 FileAccess.Read 和 FileShare.ReadWrite 打开文件,根据本指南 https://stackoverflow.com/questions/897796/how-do-i-open-an-already-opened-file-with-a-net-streamreader,因为我不关心文件在读取时是否打开用于写入。
在某些情况下,当我正在读取的文件被另一个应用程序打开时,System.IO.FileStream.Read() 方法会抛出 System.IO.IOException,“该进程无法访问该文件,因为另一个进程已锁定该文件的一部分”文件”。这是error 33 http://msdn.microsoft.com/en-us/library/ms681382.aspx,或者我认为 HResult 0x80070021。 [EDIT:我相信当另一个进程调用时可以返回这个锁定文件Ex http://msdn.microsoft.com/en-us/library/aa365203.aspx锁定文件内的字节范围。]
当我收到此错误时,我想暂停并重试。我认为这是在这里采取的适当行动。如果锁定过程快速释放字节范围锁定,那么我可以继续读取文件。
我怎样才能将这个原因的 IOException 与其他原因区分开来?我可以想到这些方法:
- 私人反思 - 不想这样做。性能会发臭。
- 调用 Exception.ToString() 并解析字符串。感觉很哈克。不适用于 i18n 版本。
我不喜欢这些选项。难道没有更好、更干净的方法吗?
我刚刚四处搜寻发现System.Runtime.InteropServices.Marshal.GetHRForException http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.gethrforexception.aspx。会返回像 0x80070021 这样的 uint 吗?
对于 .Net Framework 4.5 及更高版本,您可以使用Exception.HResult
财产:
int hr = ex.HResult;
对于旧版本,您可以使用Marshal.GetHRForException http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.gethrforexception.aspx取回 HResult,但是这个有明显副作用,不推荐 https://blogs.msdn.microsoft.com/yizhang/2013/01/18/marshal-gethrforexception-does-more-than-just-get-hr-for-exception/:
int hr = Marshal.GetHRForException(ex);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)