VB.NETでTry Catch Finallyを使う方法!例外処理を解説

VB.NET

今回はVB.NETの例外処理についてです。

プログラムを書いていると

  • ファイルが存在しない
  • 数値に変換できない文字列が入力された
  • ネットワークやDB接続でエラーが起きた

といった「実行時エラー(例外)」が必ず発生します。

こうしたエラーを適切に処理するために使うのが、Try Catch Finally(例外処理)です。

この記事では下記の内容を、サンプルコード付きで解説します。

  • Try Catch Finallyの基本構文
  • よくある例外処理の書き方
  • Catchを複数使う方法
  • Finallyの役割
  • 例外処理を書くときの注意点

Try Catch Finallyとは?(VB.NETの例外処理)

Try Catch Finallyは、プログラム実行中に発生するエラー(例外)を捕まえて、安全に処理するための構文です。
例外処理を行わないと、エラー発生時にプログラムが強制終了してしまいます。

Try Catchを使うことで、

  • エラー内容を表示できる
  • 処理を中断せずに続行できる
  • 安全に後片付けができる

といったメリットがあります。

Try Catch Finallyの基本構文

Try
    ' 例外が発生する可能性のある処理
Catch ex As Exception
    ' エラーが発生したときの処理
Finally
    ' エラーの有無に関わらず必ず実行される処理
End Try

各ブロックの役割

ブロック 役割
Try 通常の処理を書く
Catch 例外が発生したときの処理を書く
Finally 必ず実行したい後処理を書く

Tryの後に続けて、例外が発生する可能性がある処理を書き
Catchには例外発生時の処理を書きます。Exceptionを使うことで、例外の詳細が確認できます。

Finallyには例外が発生してもしなくても、処理の最後に実行したい処理を書きます。

簡単なTry Catchのサンプル例

ここからは簡単なサンプルコードで確認していきます。

0で割ったときの例外処理

Try
    Dim a As Integer = 10
    Dim b As Integer = 0
    Dim result As Integer = a \ b
    Console.WriteLine(result)
Catch ex As Exception
    Console.WriteLine("エラーが発生しました")
End Try

変数aに入れた数値を、変数bの「0」で割っています。
明らかな0除算なので、エラーになり、Catchの方に処理が移ります。

実行結果

実際に実行すると、例外が発生しても、プログラムは落ちずに処理されることが確認できます。
Catchに処理が移り、エラーだったときのメッセージが表示されます。

エラーが発生しました

Try Catchが効かない

直接0で割ろうとするなど、コンパイル時にエラーが検知できる場合にはコンパイルエラーになります。
例えば、下記のようなコードです。

Try
    Dim result As Integer = 10 \ 0
    Console.WriteLine(result)
Catch ex As Exception
    Console.WriteLine("エラーが発生しました")
End Try

こちらのコードを実行しようとすると、このようにエラーになります。
error BC30542: この式の評価中に 0 による除算が発生しました。

例外の内容を表示する方法

例外の詳細内容を取得したいときです。
Exceptionオブジェクトにはエラーの詳細が入っています。

Try
    Dim a As Integer = 10
    Dim b As Integer = 0
    Dim result As Integer = a \ b
    Console.WriteLine(result)
Catch ex As Exception
    Console.WriteLine(ex.Message)
End Try

オブジェクトexMessageプロパティにアクセスすることで例外の内容が確認できます。

実行結果

実際に出力すると、下記のようにエラーメッセージが表示されます。
Exceptionの内容出力は、デバッグ時やシステムのログ出力でよく使われます。

Attempted to divide by zero.

Catchを複数書く方法(例外の種類ごとに処理)

VB.NETでは、例外の種類ごとにCatchを分けることができます。
例えば、下記のようにCatchを複数書くことが可能です。

Try
    Dim num As Integer = Integer.Parse("abc")
Catch ex As FormatException
    Console.WriteLine("数値の形式が正しくありません")
Catch ex As Exception
    Console.WriteLine("その他のエラーが発生しました")
End Try

Integer.Parseを使って、渡した引数「abc」を数値変換しようとしています。
数値変換できない文字列なので、FormatExceptionが発生します。

結果「数値の形式が正しくありません」のみが出力されて処理が終わります。
上記のように書いた場合、FormatException以外はExceptionで例外がキャッチされます。

ポイント

  • 具体的な例外を先に書く
  • Exceptionは最後に書く

Finallyの使いどころ

Finallyは例外が起きても起きなくても必ず実行される処理です。

よくある用途

  • ファイルを閉じる
  • DB接続を解放する
  • 後片付け処理

サンプル例(Finallyあり)

Try
    Console.WriteLine("処理を開始します")
    Dim a As Integer = 10
    Dim b As Integer = 0
    Dim result As Integer = a \ b
Catch ex As Exception
    Console.WriteLine("エラーが発生しました")
Finally
    Console.WriteLine("後処理を実行します")
End Try

0除算のエラーが発生する処理に、Try Catchに加えて、Finallyブロックを追加しています。

実行結果

実行すると、下記のように処理を開始してから、エラーが発生し後処理のFinallyが動いたことが確認できます。

処理を開始します
エラーが発生しました
後処理を実行します

Finallyは省略可能

Finallyは省略可能なので、下記のように書くことができます。

Try
    ' 処理
Catch ex As Exception
    ' エラー処理
End Try

ただし、リソース解放が必要な場合はFinallyを使うのが基本です。

Try Catchを書くときの注意点

Try Catchを書くときの注意点です。

なんでもTry Catchで囲まない

Try
    ' すべての処理
Catch ex As Exception
End Try

例外が発生しそうな処理だけ囲むようにしましょう。

👉 エラー原因が分からなくなるためNG

Catchで何もしないのは避ける

Catch ex As Exception
    ' 何もしない
End Try

せっかくCatchしているので、原因がわかるようにしておくと良いです。

👉 最低でもログ出力やメッセージ表示を行いましょう。

Try Catch Finallyはどんな場面で使う?

  • ファイル操作(読み書き)
  • 数値変換(Parse)
  • DB・API通信
  • ユーザー入力のチェック

「失敗する可能性がある処理」には必ず例外処理を考えるのがポイントです。

まとめ

今回はVB.NETのTry Catch Finallyについて確認していきました。

  • Try Catch FinallyはVB.NETの基本的な例外処理構文
  • エラーが起きてもプログラムを安全に動かせる
  • Catchは例外の種類ごとに分けられる
  • Finallyは後片付け処理に使う

例外処理もしっかり書いて、システムが安全に動くようにしていきましょう。

コメント