今回は、VB.NETの例外処理(Try-Catch-Finally)の使い方についてご紹介します。
例外処理とは
プログラムは、実行時にファイルの読み込み失敗や無効な操作など、さまざまな問題によってエラーが発生する可能性があります。
こうした予期しないエラーを例外と呼び、適切に処理しないとプログラムが強制終了してしまうことがあります。
VB.NETでは、これらのエラーを安全に処理し、リソースを正しく解放するためにTry-Catch-Finally構文を用います。
Try-Catch-Finallyの基本構造
強固なアプリケーションを実装するうえで、Tryブロックにエラーが起こりうる処理をまとめ、Catchブロックでエラーを捕捉します。
さらに、エラーの有無にかかわらず必ず実行したい処理をFinallyブロックに書くことで、適切なリソース解放などを実現できます。
以下が最も基本的な構文です。
1 2 3 4 5 6 7 |
Try ' 例外が発生するかもしれない処理を記述 Catch ex As Exception ' 発生した例外を捕捉し、ログ出力やメッセージ表示などを行う Finally ' リソース解放など、必ず実行したい後処理を記述 End Try |
どんな例外でも処理を継続できるようにするためには、Catchブロックを複数用意して想定される例外を個別に処理できます。
また、Finallyブロックは省略可能ですが、リソースの開放などを行う場合は活用するのがおすすめです。
実用的な具体例
単純な例外処理の例
ここでは、0で割り算をすることで故意に例外を起こしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Try Dim x As Integer = 10 Dim y As Integer = 0 Dim result As Integer = x \ y ' ゼロ除算でエラーが発生 Console.WriteLine("結果:" & result) Catch ex As DivideByZeroException Console.WriteLine("0で割ろうとしました。エラー内容:" & ex.Message) Catch ex As Exception Console.WriteLine("予期しないエラーが発生しました:" & ex.Message) Finally Console.WriteLine("後始末を行います。") End Try |
0で割ろうとしました。エラー内容:Attempted to divide by zero.
後始末を行います。
この例では、DivideByZeroExceptionを先に捕捉し、より限定的な例外に対して適切な対処を行っています。
複数の例外をキャッチする例
次に、ファイルを読み込む場合など、複数の異なるエラーが想定される処理を試してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Try ' 存在しないファイルを読み込むことを想定 Dim filePath As String = "C:\not_found.txt" Dim fileContent As String = System.IO.File.ReadAllText(filePath) ' 実際にはさらに別の処理が続く想定 Dim number As Integer = 10 Dim zero As Integer = 0 Dim calc As Integer = number \ zero Catch ex As System.IO.FileNotFoundException Console.WriteLine("ファイルが見つかりませんでした。") Catch ex As DivideByZeroException Console.WriteLine("ゼロ除算が発生しました。") Catch ex As Exception When ex.Message.Contains("特定のキーワード") Console.WriteLine("特定のエラーが発生しました。") Catch ex As Exception Console.WriteLine("予期しないエラーが発生しました:" & ex.Message) Finally Console.WriteLine("必ず実行される処理です。") End Try |
ファイルが見つかりませんでした。
必ず実行される処理です。
このように、Catchブロックを複数用意することで、エラー種別に応じたより詳細な対処を実現できます。
再スロー(Rethrow)の活用例
状況によってはエラーの記録だけ行い、処理を呼び出し元に返したい場合があります。
そのようなときは、Catchブロックで例外情報を簡単に処理した後、Throwキーワードだけを使って再スローします。
1 2 3 4 5 6 7 8 9 10 11 12 |
Try ' 何らかの操作で例外が発生する可能性あり Dim data As Integer() = {1, 2, 3} Console.WriteLine(data(5)) ' インデックス範囲外でエラー発生 Catch ex As Exception ' エラーログなどを出力 Console.WriteLine("ログ記録:エラーが発生しました => " & ex.Message) ' ここで再度スロー Throw Finally Console.WriteLine("後処理を実行します。") End Try |
ログ記録:エラーが発生しました => Index was outside the bounds of the array.
後処理を実行します。
(上位で再びキャッチされる想定)
Throw exを使うとスタックトレースがリセットされます。
オリジナルの例外情報を活かしたい場合は、Throwだけを使用すると良いでしょう。
まとめ
VB.NETの例外処理は、エラーを安全にハンドリングし、プログラムを安定稼働させるうえで欠かせない仕組みです。
Try-Catch-Finallyを正しく活用し、複数のCatchや再スローなどの手法を組み合わせれば、多様なエラーを柔軟に扱うことができます。
リソースの解放はFinallyで行うなど、基本を押さえることでメンテナンス性の高いコードを実現できます。