例外の詳細判断について への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 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 
 'プロセスはファイルにアクセスできません。別のプロセスがファイルの一部をロックしています。 

早速確認してみようと思います。
ありがとうございました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 11:57:41
この前作成したプログラムでSystem.IO.IOException例外が発生しました。
メッセージは、「別のプロセスで使用されているため、プロセスはファイル '(ファイル名)' にアクセスできません。」でした。
そこで、Try~Catch exでSystem.IO.IOExceptionを検知した場合、
該当ファイルが別プロセスで使用されていることを前提にした対応を行おうと思ったのですが、
もし、別の例外理由でもSystem.IO.IOExceptionが出るとなると、上記前提は使えません。

System.IO.IOExceptionは「別のプロセスで使用されているため...」以外の理由でも出ますか?
その場合、ex.Message以外で例外の理由を区別する方法はありますか?