お世話になります。
現在、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の形は崩さないように対応したいです)
以上、よろしくお願いします。
当方プログラミングに不慣れなため、分かりにくい箇所などがあれば遠慮なく言及してください。
No.1
- 回答日時:
特定動作させたい例外があるなら、
DirectoryNotFoundException
UnauthorizedAccessException
あたりでキャッチすればいいんじゃないんですか?
Exceptionで捕捉してせこせこ自力で検証する意味がわかりません。
発行される例外は以下に記されています。
https://msdn.microsoft.com/ja-jp/library/5h0z48d …
そうですね、せこせこ検証した理由としては、例外の種類を特定のものだけにしてしまうと
他の例外が発生した時に補足できないのではないかと思ったという点があげられます。
また、初心者すぎてException以外あまり分からないという悲しい点もあげられます・・・。
一応今起きている例外はnaktakさんに張り付けていただいたリンク先で特定することができたので、
とりあえず完成形に一歩近付けることができました。
回答ありがとうございました。
No.2ベストアンサー
- 回答日時:
> 例外の種類を特定のものだけにしてしまうと他の例外が発生した時に補足できないのではないかと思っ
> たという点があげられます。
通常、必要な例外だけを捕捉するのが常套です。
捕捉するということは、特定の動作をさせたいからですよね。
逆に、今のif ~ elseif ~という書き方では、結局何をキャッチして特定の動作をさせたいの?となります。
何がどうなって発生した例外かもわからないのに、検証の余地がありません。
また、実装を組んだとしても、結果的にその条件に合致しない時、全く意味のない処理であることになります。
そのため、Exceptonクラスで全ての例外を捕捉後、if ~ elseif ~という書き方を容認したとしても、そのif文は、exの例外がどんな例外が発生した場合か、という条件式になるはずです。
(これは、複数の例外キャッチするが、それらで全く同じ例外処理をしたい、と言った場合などには有効です)
先に記したリンク先に、New FileStream()を実施時に発生しうる例外がすべて記されています。
その中で、特定の動作をさせたい例外は決まっているはずです。
もしであれば、まずはExceptionで捕捉した時、ex内にはどんなExceptionクラスが発行されたかをデバッグで確認するといいでしょう。
それが有り得る、かつ特定の動作が必要だとした時、初めてそのExceptionクラスを捕捉して例外処理を実装すればいいです。
それ以外の例外が発生した場合、最上位の呼出元などで Exceptionクラスで捕捉し、『自分が想定していなかった例外処理』として書くべきです。
ログ出力するとか。
回答ありがとうございます^^
確かにIf文で限定するよりも、どんな例外が起こるかで判別する方がいいですね…。
大変すっきりしました。
これからはまずデバックでどんな例外が起こるかを見てから処理をするようにしてみます!
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
個別に違う添付ファイルを付け...
-
e-taxで送信ファイルの拡張子が...
-
ガラケーからPCへの写真の取り込み
-
iPhoneの内蔵の記憶媒体は、HDD...
-
複数のブックを新しいブックのS...
-
stdio.hの中身
-
ファイル数と合計サイズの取得方法
-
クリッカブルマップ(イメージ...
-
PC内で速度を遅くした音源をCD...
-
A4の紙に印刷されている文字を...
-
拡張子「.IDJ」を、windo...
-
EXCELマクロでのtifファイルの...
-
プロがDreamWeaverを使わない理...
-
VBA:カウンターの i の値が開放...
-
スマホでtxtファイルを編集する...
-
いいエディター探してます。
-
TextBoxにフォーカスを与えると...
-
ドアスコープへの取り付けに向...
-
CD/DVDメディア挿入の検知
-
ホームページビルダーのプレビ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
個別に違う添付ファイルを付け...
-
e-taxで送信ファイルの拡張子が...
-
エクセルで「特定の文字を含む...
-
スマホでtxtファイルを編集する...
-
複数のブックを新しいブックのS...
-
A4の紙に印刷されている文字を...
-
iPhoneの内蔵の記憶媒体は、HDD...
-
ビデオファイルのプロパティの...
-
エアコンの冷媒 R410Aの重...
-
ガラケーからPCへの写真の取り込み
-
拡張子「.IDJ」を、windo...
-
Fortniteのクラッシュについて
-
2枚、マイクロSDカードを入...
-
VBA:カウンターの i の値が開放...
-
ファイル数と合計サイズの取得方法
-
stdio.hの中身
-
TextBoxにフォーカスを与えると...
-
PC内で速度を遅くした音源をCD...
-
リストビューの選択状態を取得...
-
GIMP separate+プラグイン クラ...
おすすめ情報
【訂正】
「画像ファイルに反応しない~」と書きましたが、今までプレビューで開いていたため反応しなかったようです…。フォトやペイントで開いて実行したらきちんと反応してくれました。
なので、【①】のコードにどう書けば上手く分岐してくれるかだけ教えていただけましたらありがたいです…。
何回もすみません、またまた実際に試してみたら上記の補足のようにいかなかったので、【訂正】は見なかったことにしてください・・・。