このコードスニペットは、UWPのアプリケーションに許可された場所の外にファイルを読み取ろうとします:UWPアプリケーションでSystem.UnauthorizedAccessExceptionの異なる "タイプ"を区別する方法はありますか?
StorageFile sf2 = await StorageFile.GetFileFromPathAsync(Path.Combine("C:\\Temp", "spam.dat"));
は、Visual Studio 2015のデバッガでインターセプトされ、素敵なポップアップに表示されSystem.UnauthorizedAccessExceptionをスロー:
全体のテキストは以下の通りです:
タイプの例外は、「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)と同じです。
あなたのライブラリーは、他の開発者によって使用されようとしているどのように正確に?それは何をするつもりですか?あなたにとって最良のことは、コードの消費者が状況をどのように処理したいかを決定できるように例外を処理しないことです。 –
ライブラリは、複数のスレッドやアプリケーションインスタンスが同じ共有ファイルを同時に読み書きできる状況に対処することが期待されています。振る舞いは既に設定されており、変更することはできません。ライブラリはすでに他の.NETプラットフォームでこのように動作しています。私はUWPポートを作成しています。 – Alex
そして私はなぜVisual Studioデバッガがこれらの例外を異なるように表示するのか不思議です。どういう違いがありますか? – Alex