VB.NETのFinallyブロックで後処理を実行する方法をわかりやすく解説
生徒
「VB.NETでTry-Catchを使うとエラーを捕まえられるのはわかるんですが、処理が終わった後に必ずやっておきたいことがある場合はどうすればいいですか?」
先生
「そのときに使うのが Finally ブロックです。Try や Catch の結果に関係なく、必ず実行したい処理を書くことができます。」
生徒
「例えば、ファイルを閉じる処理とかですか?」
先生
「そうです。ファイルやデータベースの接続など、リソースを解放する処理は Finally に書くのが基本です。」
1. Finallyブロックの基本構造
VB.NETの Finally ブロックは、Try と Catch の後に書き、必ず実行される処理を定義します。エラーが発生しても、正常に終了しても、後処理を確実に実行するための構文です。
Try
Console.WriteLine("処理を実行中")
Catch ex As Exception
Console.WriteLine("エラーが発生しました")
Finally
Console.WriteLine("必ず実行される後処理")
End Try
処理を実行中
必ず実行される後処理
上記の例では、例外がなくても Finally 内のメッセージは必ず表示されます。
2. ファイル操作でのFinallyの活用例
ファイルを開いて読み込む場合、途中でエラーが発生するとファイルが閉じられないことがあります。Finally を使うと、必ずファイルを閉じることができます。
Dim file As System.IO.StreamReader = Nothing
Try
file = My.Computer.FileSystem.OpenTextFileReader("sample.txt")
Dim line As String = file.ReadLine()
Console.WriteLine(line)
Catch ex As System.IO.FileNotFoundException
Console.WriteLine("ファイルが見つかりません")
Finally
If file IsNot Nothing Then
file.Close()
Console.WriteLine("ファイルを閉じました")
End If
End Try
ファイルが見つかりません
ファイルを閉じました
ファイルが存在しない場合でも Finally 内で安全にファイルを閉じ、リソースを解放できることが確認できます。
3. Finallyブロックで覚えておくポイント
Tryの中で処理を実行Catchで例外(エラー)を捕まえるFinallyは例外の有無に関わらず必ず実行- ファイルやデータベースの接続など、リソースの解放に使うと安全
- 複雑な処理でも、プログラムの安定性を保つために重要
VB.NETの Finally ブロックを正しく理解すると、エラーに強く、安全で安定したプログラムを作ることができます。初心者でも、リソース管理や後処理を確実に行う習慣をつけることが大切です。
4. Finallyが実行されないケースはあるのか?
基本的に、VB.NETの Finally ブロックは「必ず実行される」ものとして扱われます。
そのため、通常の処理や例外が発生した場合でも、Finallyに書いた後処理は確実に動きます。
ただし、プログラム自体が強制終了された場合や、環境そのものが停止した場合など、
処理の流れが完全に断ち切られる状況では実行されないことがあります。
とはいえ、日常的なアプリケーション開発や業務システムの中で、 Finallyが実行されない場面に遭遇することはほとんどありません。 そのため、「後処理はFinallyにまとめる」という基本ルールを守っておけば、 ファイルの閉じ忘れや接続の解除忘れといったミスを大幅に減らせます。 初心者のうちは、「絶対に片付けたい処理はFinally」と覚えておくと安心です。
5. Catchを省略してFinallyだけを書くこともできる
VB.NETでは、Try と Finally だけを組み合わせて使うことも可能です。
つまり、「エラー内容の処理は特に行わないが、後処理だけは必ず実行したい」
というケースでもFinallyを活用できます。
この書き方は、処理の成否に関係なく後片付けだけを重視したい場合に向いています。
Try
Console.WriteLine("処理を実行します")
Finally
Console.WriteLine("必ず実行される後処理")
End Try
処理を実行します
必ず実行される後処理
このように、Catchを書かなくてもFinallyは使えます。 エラーが発生した場合はそのまま呼び出し元に伝わりますが、 Finallyの中身は必ず実行されるため、リソース解放や状態のリセットに適しています。 「エラー処理」と「後処理」を分けて考えられるようになると、 VB.NETの例外処理がより整理されて見えるようになります。
6. Finallyを使うとコードの保守性が高まる理由
Finallyブロックを正しく使う最大のメリットは、コードの保守性が高まることです。 後処理が一か所にまとまっていると、処理の流れを追いやすくなり、 「どこで何を片付けているのか」が一目で分かるようになります。 これは、自分以外の人がコードを読む場面でも大きな助けになります。
また、後から処理内容を変更する場合でも、 Finallyの中だけを見直せばよいケースが増えるため、 修正による影響範囲を小さく抑えられます。 Try・Catch・Finallyを役割ごとに使い分けることで、 エラーに強く、読みやすく、長く使えるVB.NETのプログラムを作れるようになります。 最初は少し意識が必要ですが、慣れてくると自然に書けるようになるでしょう。
まとめ
Finallyは「最後に必ずやる後片付け」を書く場所
VB.NETの例外処理では、まずTryで処理を試し、問題が起きたときはCatchで受け止めます。ここまでは多くの人がすぐに理解できますが、実務で大事になるのが「途中で失敗しても、最後に必ず片付けたい作業をどうするか」です。 たとえばファイルを開いたら閉じる、通信の接続を作ったら切る、画面のロックを解除する、処理中のフラグを元に戻す、といった後処理は、成功したときだけ実行されても困ります。 そこで活躍するのがFinallyブロックです。Finallyに書いた処理は、例外が起きても起きなくても、基本的に必ず実行されます。つまり、プログラムの終わり際に「忘れたら危ないこと」をまとめて置ける、安心の置き場です。
初心者が押さえたい使いどころ
初心者のうちは、Finallyを「エラーが出たときだけ動くもの」と勘違いしがちです。しかし実際は逆で、Finallyは結果に関係なく動くからこそ価値があります。 とくに、ファイル、データベース、ネットワーク、タイマー、ロック、画面表示の一時停止など、外部の資源や状態を扱うときに役立ちます。 こうした資源は、閉じ忘れや解除忘れが積み重なると、動作が遅くなったり、次の処理が失敗したり、原因が追いにくい不具合につながります。 「開いたら閉じる」「つかんだら離す」「変更したら戻す」を徹底するために、Finallyを使う習慣を早めに身につけると、VB.NETのプログラムが一気に安定します。
サンプルプログラム:処理結果に関係なく必ず後処理を行う
次のサンプルでは、処理の途中で例外が起きる可能性がある状況を想定しつつ、最後に必ず「後処理のメッセージ」を出します。 実際の現場では、この部分が「ファイルを閉じる」「接続を切る」「一時ファイルを削除する」などに置き換わります。 まずは、Finallyが必ず実行される感覚を体で覚えるのが近道です。
Try
Console.WriteLine("処理を開始します")
Dim number As Integer = 0
Dim result As Integer = 10 \ number 'ここで例外が起きる可能性があります
Console.WriteLine("計算結果は" & result & "です")
Catch ex As Exception
Console.WriteLine("途中で問題が起きました")
Finally
Console.WriteLine("最後に必ず後処理を実行します")
End Try
処理を開始します
途中で問題が起きました
最後に必ず後処理を実行します
この例では、割り算のところで問題が起きても、Finallyの行は必ず表示されます。 ここが重要で、エラーで処理が中断されそうになっても、後処理だけはやり切れる、という安心感が生まれます。 たとえば読み込み中のファイルを閉じないまま終わってしまうと、次の読み込みが失敗したり、別の処理が止まったりすることがあります。 Finallyを使うことで、そうした「終わり方の悪さ」を防ぎやすくなります。
ファイルや接続の後処理で意識したいこと
後処理は、やる内容自体は地味ですが、プログラムの信頼性を左右します。ファイルや接続は、開くときより閉じるときのほうが重要だと言われることもあります。 失敗しても閉じる、成功しても閉じる、途中で戻っても閉じる、という一貫した姿勢があると、バグの混入がぐっと減ります。 また、Finallyの中では「後処理だけ」に集中し、複雑な本処理を増やさないのがコツです。後処理でさらに問題が起きると、原因が見えにくくなるからです。 まずは、閉じる、解除する、戻す、通知する、といった簡単な作業を丁寧に書くところから始めると迷いません。
よくある失敗と対策
Finallyを学び始めたころによくある失敗は三つあります。一つ目は、後処理をTryの最後に書いてしまうことです。正常に終わったときは動きますが、途中で例外が起きるとその行まで到達せず、閉じる処理や解除処理が飛ばされます。 二つ目は、Catchの中だけで後処理をしてしまうことです。これだと例外が起きたときだけは片付く一方で、正常に終わったときには片付け忘れになります。後処理は成功と失敗の両方で必要になることが多いので、Finallyに置くのが自然です。 三つ目は、Finallyに本処理まで詰め込みすぎることです。Finallyはあくまで後片付けの場所なので、ここで複雑な計算や分岐を増やすと読みづらくなり、後処理自体が壊れてしまう危険も増えます。 迷ったら、閉じる、破棄する、元に戻す、表示を戻す、といった短い作業だけを書き、必要なら別のメソッドに分けるのが安全です。
サンプルプログラム:ファイルを開いたら必ず閉じる
もう一つ、初心者がイメージしやすいのがファイル操作です。ファイルは開いたままにすると、他の処理から使えなくなったり、思わぬエラーが出たりします。 下の例では、ファイルが見つからない場合でも、最後に「閉じる処理」を通す形にしています。 なお、実際にはファイルが開けなかったときに閉じようとしても危ないので、存在を確認してから閉じる流れにします。こうした細かい気づかいも、例外に強いVB.NETコードの基本です。
Dim reader As System.IO.StreamReader = Nothing
Try
reader = My.Computer.FileSystem.OpenTextFileReader("sample.txt")
Console.WriteLine("読み込み開始")
Console.WriteLine(reader.ReadLine())
Catch ex As Exception
Console.WriteLine("読み込みに失敗しました")
Finally
If reader IsNot Nothing Then
reader.Close()
Console.WriteLine("ファイルを閉じました")
End If
End Try
ここで覚えておきたいのは、後処理は「いつ実行するか」だけでなく、「安全に実行できるか」も大切だという点です。 開けていないのに閉じようとすると別の例外につながるため、Nothingかどうかを確認してから閉じています。 こうした形にしておくと、読み込みが成功した場合でも失敗した場合でも、最後は同じ流れで締められます。
覚えやすいチェックリスト
Finallyを使う場面を見分けるために、次のようなチェックリストが役に立ちます。 何かを開く、何かをつかむ、何かを変更する、という操作が出てきたら、必ず最後に戻す作業が必要かを考えてみてください。 たとえば、ファイルを開いたなら閉じる、接続を開始したなら切る、画面の入力を止めたなら再開する、メモリ上の大きなデータを確保したなら解放する、といった具合です。 「元に戻す作業がある」と気づいたら、Tryの外に書くのではなく、Finallyに入れることで抜け漏れが減ります。 さらに、後処理の内容は短く保ち、後から見ても一目で分かる言葉で書くと、保守や見直しがしやすくなります。
生徒
「TryとCatchは分かったつもりでしたけど、Finallyって思ったより大事なんですね。エラーが出ても出なくても動くなら、最後の片付けに向いていそうです」
先生
「その理解で大丈夫です。プログラムは途中で止まることがありますが、止まったときほど後処理が必要になります。だからFinallyにまとめるのが基本なんです」
生徒
「ファイルを開いたら閉じる、接続したら切る、っていうのを忘れないためにFinallyを使うんですね。もし閉じ忘れたら、次の処理にも影響しそうです」
先生
「そうですね。小さなサンプルだと違いが見えにくいですが、積み重なると大きな差になります。後処理が整っているコードは読みやすく、保守もしやすいです」
生徒
「これからは、処理の最後に必ずやりたいことがあるときは、まずFinallyを思い出して書いてみます」
先生
「いいですね。TryとCatchで守り、Finallyで締める。これを意識できるだけで、VB.NETの例外処理は一段と安定します」