例外の詳細判断について

タグの編集
投稿者 nameko  (社会人) 投稿日時 2020/10/6 11:57:41
この前作成したプログラムでSystem.IO.IOException例外が発生しました。
メッセージは、「別のプロセスで使用されているため、プロセスはファイル '(ファイル名)' にアクセスできません。」でした。
そこで、Try~Catch exでSystem.IO.IOExceptionを検知した場合、
該当ファイルが別プロセスで使用されていることを前提にした対応を行おうと思ったのですが、
もし、別の例外理由でもSystem.IO.IOExceptionが出るとなると、上記前提は使えません。

System.IO.IOExceptionは「別のプロセスで使用されているため...」以外の理由でも出ますか?
その場合、ex.Message以外で例外の理由を区別する方法はありますか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/10/6 12:25:15
> 別の例外理由でもSystem.IO.IOExceptionが出るとなると、上記前提は使えません。

たとえば、「デバイスの準備ができていません。」も IOException となることがあります。
文字通り、入出力(Input-Output)に対する汎用例外に過ぎません。

ファイル入出力に対しては、IOException 以外にも
様々な例外が起こりえます。たとえば、UnauthorizedAccessException など。
https://docs.microsoft.com/ja-jp/dotnet/standard/io/handling-io-errors?WT.mc_id=DT-MVP-8907


> ex.Message以外で例外の理由を区別する方法はありますか?
HResult で絞り込めるかと思います。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30283
投稿者 nameko  (社会人) 投稿日時 2020/10/6 14:50:15
ご回答ありがとうございます。

> HResult で絞り込めるかと思います。
> http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30283 

これですね。

Catch ex As IOException When ex.HResult = STIERR_SHARING_VIOLATION '&H80070020 
 'プロセスはファイルにアクセスできません。別のプロセスが使用中です。 
Catch ex As IOException When ex.HResult = STIERR_DEVICE_LOCKED '&H80070021 
 'プロセスはファイルにアクセスできません。別のプロセスがファイルの一部をロックしています。 

早速確認してみようと思います。
ありがとうございました。