【发布时间】:2017-01-31 16:50:58
【问题描述】:
此代码 sn-p 尝试读取 UWP 应用允许的位置之外的文件:
StorageFile sf2 = await StorageFile.GetFileFromPathAsync(Path.Combine("C:\\Temp", "spam.dat"));
抛出 System.UnauthorizedAccessException,它被 Visual Studio 2015 调试器拦截并显示在一个漂亮的弹出窗口中:
全文如下:
“System.UnauthorizedAccessException”类型的异常发生在 mscorlib.ni.dll 中,但未在用户代码中处理
WinRT 信息:无法访问指定的文件或文件夹 (C:\Temp\spam.dat)。该项目不在应用程序有权访问的位置(包括应用程序数据文件夹、可通过功能访问的文件夹以及 StorageApplicationPermissions 列表中的持久项目)。确认该文件未标记系统或隐藏文件属性。
“System.UnauthorizedAccessException”类型的异常发生在 mscorlib.ni.dll 中,但未在用户代码中处理
现在另一个代码sn-p(这个代码试图读取一个已经打开写的文件):
StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(ApplicationData.Current.LocalFolder.Path);
StorageFile file = await folder.CreateFileAsync("spam.dat", CreationCollisionOption.ReplaceExisting);
Stream fs = await file.OpenStreamForWriteAsync();
StorageFile sf2 = await StorageFile.GetFileFromPathAsync(Path.Combine(ApplicationData.Current.LocalFolder.Path, "spam.dat"));
await sf2.OpenStreamForReadAsync();
调试器中的异常屏幕看起来完全不同:
附加信息:访问被拒绝。 (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))
我不明白调试器对这些异常有何不同。在我的代码中,我需要了解获得 UnauthorizedAccessException 的原因 - 如果是因为文件被锁定以供读取,因为它被另一个作家占用(我可以稍后再试)或者由于其他原因,比如它在 LocalFolder 之外(而且不值得重试)。我实际上正在开发一个库,将由 UWP 应用程序的开发人员使用,所以我不知道我将获得哪个文件/文件路径,并且不能对权限、目录结构等做出任何假设。我只是在输入时获得路径而且,万一出了什么事,只能用异常处理来了解原因。
因此,Visual Studio 调试器以某种方式看到了差异,但我不知道如何以编程方式执行此操作。 InnerException 在两种情况下都为 null,HResult 也相同(0x80070005)。
【问题讨论】:
-
其他开发人员将如何使用您的库?它会做什么?对您来说最好的办法可能是不处理异常,以便您的代码的使用者可以决定他们希望如何处理这种情况。
-
该库有望处理多个线程甚至应用程序实例可以同时读取/写入相同共享文件的情况。行为已经设置,我无法更改它。该库已经在其他 .NET 平台上采用了这种方式,我只是在制作一个 UWP 端口。
-
我很好奇为什么 Visual Studio 调试器显示这些异常的方式如此不同。它们之间有什么不同?
标签: c# exception visual-studio-2015 uwp