無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

VB.NETをつつく24−例外処理。緊急事態発生!隊長報告します!

C#のオブジェクト指向についての機能も軽くつついたから次は何をつつこうかな?
ピキュピキュピキュピキュピキュピキュピキュピキュピキュピキュピキュピキュピキュピーン♪
閃いたぞ。例外をつつこう。例外とは何かというと、ひとまずエラーの通知処理だと思って。それじゃあ、いつものように、行くぞー。とぉー。


バサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバササバ好き?



Imports System

Module Module1

    Sub Main()
        Try
            ArgumentException()
            Console.WriteLine("ここは絶対実行されません。")
        Catch ex As ArgumentException
            Console.WriteLine("例外がスローされました。" & _
                "詳細は次の通りピヨ。" & vbLf)
            Console.WriteLine("例外のメッセージ{0}" & vbLf, _
                ex.Message)
            Console.WriteLine("スタックトレース{0}" & vbLf, _
                ex.StackTrace)
            Console.WriteLine("例外の発生源となったオブジェクト{0}" & vbLf, _
                ex.Source)
        Finally
            Console.WriteLine("ここは絶対実行されるピヨッ。" & vbLf)
        End Try
    End Sub

    Private Sub ArgumentException()
        ArgumentException2()
    End Sub

    Private Sub ArgumentException2()
        Throw New ArgumentException("例外を強制発生させたピヨ。")
    End Sub

End Module

まずはこのコードをステップ実行してみて。そうすれば、例外の大まかな動きはわかると思う。
やってみた?じゃあ解説するピヨ。
.NETの例外処理で重要な要素は4個あるピヨ。まず1つ目は、Tryブロックピヨ。Tryブロック内には処理が失敗することが予想される処理を記述するピヨ。今回のサンプルプログラムの場合、絶対例外が発生するのがわかっているから簡単だけど、実務ではこれは案外難しいことなんだ。その理由は後で話すよ。
2つ目の要素はCatchブロックピヨ。 このブロックは予想される例外オブジェクトを指定して、 その例外に対してするべき処理を書くんだ。でも出来る事といっても大概はエラーだから、 このサンプルプログラムのようにプログラマに報告することぐらいしか出来ない場合が多いピヨ。
3つ目の要素はFinallyブロックピヨ。このブロックは必ず実行したい処理がある場合に用意するピヨ。例えば、データベースへのConnectionを開放するとか、ファイルオブジェクトを開放するとか、そんな事に使用するんだ。
最後の要素はThrowメソッドピヨ。例外を受け取る機構があるということは、例外を発生させる文法が必要になるよね。それがVB.NETではThrowメソッドなんだ。 このメソッドを使うとtryブロックが無いとプログラムが異常終了するから多用は駄目ピヨ。 実際にどうなるか試してみよう。

Imports System

Module Module1

    Sub Main()
        ArgumentException() 'Tryブロックの外へ出した
        Try
            Console.WriteLine("ここは絶対実行されません。")
        Catch ex As ArgumentException
            Console.WriteLine("例外がスローされました。" & _
                "詳細は次の通りピヨ。" & vbLf)
            Console.WriteLine("例外のメッセージ{0}" & vbLf, _
                ex.Message)
            Console.WriteLine("スタックトレース{0}" & vbLf, _
                ex.StackTrace)
            Console.WriteLine("例外の発生源となったオブジェクト{0}" & vbLf, _
                ex.Source)
        Finally
            Console.WriteLine("ここは絶対実行されるピヨッ。" & vbLf)
        End Try
    End Sub

    Private Sub ArgumentException()
        ArgumentException2()
    End Sub

    Private Sub ArgumentException2()
        Throw New ArgumentException("例外を強制発生させたピヨ。")
    End Sub

End Module

実行してごらん。変なメッセージが出るよ。
System.ArgumentException はハンドルされませんでした。
これは、対応するcatchブロックが無いことを示しているんだ。つまり、解決できない状況になっているという深刻な状態なんだ。だからといって、これは駄目だよ。

Catch ex As ArgumentException    '全部隠しちゃえ!

こんな事をしてしまったら発生した問題が誰にもわからないまま放置されてしまう。これは問題解決になっておらず、事件を隠蔽しているだけだから絶対しちゃ駄目だよ。次回へ続く・・・
別窓 | VB.NET | コメント:0 | トラックバック:0 | ∧top | under∨
<<C#をつつく24−例外処理。緊急事態発生!隊長報告します! | 無差別に技術をついばむ鳥 | C++/CLIをつつく24−例外処理。緊急事態発生!隊長報告します!>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |