プロが教えるわが家の防犯対策術!

お世話になります。
現在、VB.NET、.NET Framework3.0でプログラムを開発しています。

書き込むファイルが開いているかどうかをチェックする(書き込み対象のファイルが開いていたら例外がCatchされる)コードがあります。
その時にファイルを開いていると、Excelファイルであれば「別のプログラムで使用されています」といったエラーが出るのですが、ビットマップファイルなどの画像ファイルではエラーが出ずにスルーされてしまいます。


以下そのコードです。


Dim fs As FileStream
Dim test As String = "C:\test.bmp"

Try

'ファイルへの書き込み
fs = New FileStream(test , FileMode.Create , FileAccess.Write , FileShare.None)

Catch ex As Exception

'書き込むファイルを保存するフォルダがあるかチェック
  If Directory.Exists(C:) Then

'省略

  'ファイルが使用中かどうかチェック
ElseIf 【①】 Then

'省略

  'その他の例外はメッセージを表示
  Else

    MsgBox(ex.Message)

End If

※省略箇所にはエラーメッセージと、それに付随するボタン押下時の動作について書いてあります。


<質問内容>
Excelファイルが使用中の際だけでなく、ビットマップファイルが使用中の際にも反応するコードの書き方はありますか?その場合、上記コードの【①】には何と書けばよいでしょうか?
両方まとめて反応するコードでも、片方ずつに反応するコードでも構いませんので、
是非皆様のお知恵を拝借させていただけますと幸いです。
(「その他の例外」も発生するので、なるべくこのIf-ElseIf-Elseの形は崩さないように対応したいです)

以上、よろしくお願いします。
当方プログラミングに不慣れなため、分かりにくい箇所などがあれば遠慮なく言及してください。

質問者からの補足コメント

  • つらい・・・

    【訂正】
    「画像ファイルに反応しない~」と書きましたが、今までプレビューで開いていたため反応しなかったようです…。フォトやペイントで開いて実行したらきちんと反応してくれました。

    なので、【①】のコードにどう書けば上手く分岐してくれるかだけ教えていただけましたらありがたいです…。

      補足日時:2018/08/24 14:47
  • 何回もすみません、またまた実際に試してみたら上記の補足のようにいかなかったので、【訂正】は見なかったことにしてください・・・。

      補足日時:2018/08/24 15:23

A 回答 (3件)

特定動作させたい例外があるなら、


DirectoryNotFoundException
UnauthorizedAccessException
あたりでキャッチすればいいんじゃないんですか?
Exceptionで捕捉してせこせこ自力で検証する意味がわかりません。

発行される例外は以下に記されています。
https://msdn.microsoft.com/ja-jp/library/5h0z48d …
    • good
    • 1
この回答へのお礼

そうですね、せこせこ検証した理由としては、例外の種類を特定のものだけにしてしまうと
他の例外が発生した時に補足できないのではないかと思ったという点があげられます。
また、初心者すぎてException以外あまり分からないという悲しい点もあげられます・・・。

一応今起きている例外はnaktakさんに張り付けていただいたリンク先で特定することができたので、
とりあえず完成形に一歩近付けることができました。

回答ありがとうございました。

お礼日時:2018/08/24 17:29

> 例外の種類を特定のものだけにしてしまうと他の例外が発生した時に補足できないのではないかと思っ


> たという点があげられます。
通常、必要な例外だけを捕捉するのが常套です。
捕捉するということは、特定の動作をさせたいからですよね。
逆に、今のif ~ elseif ~という書き方では、結局何をキャッチして特定の動作をさせたいの?となります。
何がどうなって発生した例外かもわからないのに、検証の余地がありません。
また、実装を組んだとしても、結果的にその条件に合致しない時、全く意味のない処理であることになります。
そのため、Exceptonクラスで全ての例外を捕捉後、if ~ elseif ~という書き方を容認したとしても、そのif文は、exの例外がどんな例外が発生した場合か、という条件式になるはずです。
(これは、複数の例外キャッチするが、それらで全く同じ例外処理をしたい、と言った場合などには有効です)

先に記したリンク先に、New FileStream()を実施時に発生しうる例外がすべて記されています。
その中で、特定の動作をさせたい例外は決まっているはずです。

もしであれば、まずはExceptionで捕捉した時、ex内にはどんなExceptionクラスが発行されたかをデバッグで確認するといいでしょう。
それが有り得る、かつ特定の動作が必要だとした時、初めてそのExceptionクラスを捕捉して例外処理を実装すればいいです。
それ以外の例外が発生した場合、最上位の呼出元などで Exceptionクラスで捕捉し、『自分が想定していなかった例外処理』として書くべきです。
ログ出力するとか。
    • good
    • 1
この回答へのお礼

回答ありがとうございます^^
確かにIf文で限定するよりも、どんな例外が起こるかで判別する方がいいですね…。
大変すっきりしました。
これからはまずデバックでどんな例外が起こるかを見てから処理をするようにしてみます!
ありがとうございました。

お礼日時:2018/08/27 09:19

ちなみに個人的には、想定しうるエラーとなる要素は、例外処理ではなく、業務処理という認識とし、個別に実装します。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!