Этот фрагмент кода пытается прочитать файл за пределами местоположения, разрешенного для приложений 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, но не было обработано в пользовательском коде.
Теперь еще один фрагмент кода (этот код пытается прочитать файл, который уже открыт для записи):
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).