連載プロフェッショナルVB.NETプログラミング第16回 例外処理を極める |
Finally文の確実性
Tryブロック内で使用するFinally文についてはすでに説明した。では、これはどの程度確実に動作するものなのだろうか。果たして、無条件に頼ってよいものなのだろうか? それを確認するために以下のようなサンプル・プログラムを記述してみた。これはさまざまなケースで、Finally文を使用してみたものだ。
|
|
さまざまなケースでのFinally文の動作を検証するVB.NETのサンプル・プログラム7 |
これを実行すると以下のようになる。
|
|
サンプル・プログラム7の実行結果 |
1〜7行目のコードは、いきなりメソッドから抜け出した場合である。実行結果を見ると5行目が実行されることが分かると思う。
9〜17行目は繰り返しの途中から脱出する場合である。実行結果を見ると14行目が実行されることが分かると思う。
19〜27行目は繰り返しの途中から脱出だが、Tryブロックがループの外側にある点が異なる。実行結果を見ると25行目が実行されることが分かると思う。脱出する個所がTryブロックの中でありさえすれば、Tryブロックを記述する場所に関係なく、Finally文が実行される。
29〜44行目はTryブロックが2重にネストしていて、どちらにもFinally文が存在する場合である。実行結果を見ると37行目も42行目も、両方とも実行されることが分かると思う。複数のTryブロックがネストして複数のFinally文が存在する場合、それらはすべて実行される。そのため、上位あるいは下位のTryブロックにすでにFinally文が存在するかどうか、気にする必要はない。書けば実行される。
46〜58行目は繰り返しがネストした途中から脱出する場合である。実行結果を見ると56行目が実行されることが分かると思う。ネストの深さはFinally文の実行とは関係ない。
60〜74行目は繰り返しの途中から例外が発生した場合である。実行結果を見ると70行目と72行目が実行されることが分かると思う。深いネスト状態から例外が起きても、Finally文は確実に実行される。
76〜82行目は何も問題なくTryブロックの実行を終える場合である。実行結果を見ると80行目が実行されることが分かると思う。途中脱出や例外の発生がなくても、Finally文はTryブロックから抜ける際に実行される。
深い階層からの例外とFinally文
Finally文の動作を確認するために、もう1つサンプル・プログラムを記述してみた。このサンプル・プログラムは、メソッド呼び出しが何重にも行っていて、その内部で例外を発生させている。
|
|
深い階層で発生した例外に対するFinally文の動作を検証するVB.NETのサンプル・プログラム8 |
これを実行すると以下のようになる。
|
|
サンプル・プログラム8の実行結果 |
このプログラムは、test1メソッドで例外が発生し、Form1_Loadメソッドでその例外をキャッチしている。そこでポイントになるのは、その中間に位置するtest2〜4メソッドに含まれるFinally文である。例外をキャッチするTryブロックは、Form1_Loadメソッド内にあるが、それではこの例外をキャッチしないTryブロックを持つtest2〜4メソッドに含まれるFinally文はどうなるだろうか。
結果を見て分かるとおり、すべてのFinally文に続くコードが実行されている。Finally文は、そのTryブロックでキャッチするか否かを問わず、すべて有効である。
次回予告
INDEX | ||
連載 プロフェッショナルVB.NETプログラミング | ||
第16回 例外処理を極める | ||
1.例外の自作 | ||
2.InnerExceptionについて | ||
3.Finally文の確実性 | ||
「プロフェッショナルVB.NETプログラミング」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|