2004年09月17日
川俣晶の縁側技術関連執筆情報『VB6プログラマーのための入門Visual Basic.NET独習講座』読者サポートtotal 2370 count

例外をキャッチする条件を指定するWhenキーワード

Written By: 川俣 晶連絡先

 これは、書籍『VB6プログラマーのための入門Visual Basic.NET独習講座』の読者サポート情報として提供されている技術解説です。

例外をキャッチする条件を限定する §

 構造化例外処理は、Catchキーワードの次に「変数名 As 型名」と記述し、その型名でキャッチする例外の種類を限定することができます。

 しかし、型名だけで制限することは、用途によっては不適切です。

 キャッチした後で条件を判定した上で、例外をそこで処理する必要がない場合は例外を再発生させる方法もあります。

 しかし、Visual Basic.NETでは、もっとスマートにこれを記述する構文が提供されています。

サンプルソース §

 指定されたファイルを読み込みますが、エラー発生時、それがドライブCのファイルならfileCheckメソッド内で例外をキャッチして処理を継続します。ドライブCではないときは、fileCheckではキャッチしません。ここでは、fileCheckSubメソッドでキャッチしています。

 なお、ファイルc:\autoexec.batは存在するが、ファイルc:\nothing.txtとd:\nothing.txtは存在しないという前提で記述されています。

Imports System.IO

Public Class Form1

    Inherits System.Windows.Forms.Form

    (" Windows フォーム デザイナで生成されたコード ")

    Private Function isDriveC(ByVal filename As String)

        Trace.WriteLine(filename & "をドライブCかチェックします。")

        Return filename.ToLower().StartsWith("c:")

    End Function

    Private Function fileCheck(ByVal filename As String) As String

        Try

            Dim reader As StreamReader = New StreamReader(filename)

            Try

                Return reader.ReadToEnd()

            Finally

                reader.Close()

            End Try

        Catch ex As IOException When Not isDriveC(filename)

            Trace.WriteLine("ドライブCではないので無視します。")

        End Try

    End Function

    Private Sub fileCheckSub(ByVal filename As String)

        Trace.WriteLine(filename & "の処理を開始します。")

        Try

            fileCheck(filename)

        Catch ex As IOException

            Trace.WriteLine(filename & "について入出力エラーが発生しました。")

        End Try

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        fileCheckSub("c:\autoexec.bat")

        fileCheckSub("c:\nothing.txt")

        fileCheckSub("d:\nothing.txt")

    End Sub

End Class

実行結果 §

c:\autoexec.batの処理を開始します。

c:\nothing.txtの処理を開始します。

c:\nothing.txtをドライブCかチェックします。

c:\nothing.txtについて入出力エラーが発生しました。

d:\nothing.txtの処理を開始します。

d:\nothing.txtをドライブCかチェックします。

ドライブCではないので無視します。

 見ての通り、ファイル名がドライブCの場合と、そうではない場合では、異なるCatchブロックでキャッチされ、その結果出力される文字列が変わっていることが分かると思います。c:\nothing.txtの場合は「c:\nothing.txtについて入出力エラーが発生しました。」と出力されていますが、d:\nothing.txtの場合は「ドライブCではないので無視します。」と出力されています。

 この相違は、Catch ex As IOException When Not isDriveC(filename)という行のWhen以下の部分によって引き起こされています。ここでは、Not isDriveC(filename)という式が、キャッチを行うかどうかの判定条件として機能しています。isDriveCメソッドは、ファイル名の先頭が"c:"であるかどうかをチェックすることで、ドライブCかどうかを判定しています。(この判定は、フルパス以外が引数に渡された場合には動作せず不完全です。あくまで解説のためのサンプルと割り切って見て下さい)。その結果、isDriveCメソッドがTrueを返した場合はNot演算子でこれはFalseとなり、キャッチは行われません。逆に、isDriveCメソッドがFalseを返した場合はNot演算子でこれはTrueとなり、キャッチが行われます。

 もう1つ注目すべき点は、c:\autoexec.batを処理するケースで、「c:\autoexec.batをドライブCかチェックします。」というメッセージが出力されていない点です。このメッセージが出力されていないということは、isDriveCメソッドが呼び出されていないということです。つまり、Not isDriveC(filename)という式の計算が行われていないということです。When以下の式は、Catch構文で指定した型名の例外が発生したあとで行われます。そのような例外が発生しない場合は、評価されることがありません。式の副作用(式から呼び出されたメソッドで変数を書き換えるなど)を期待する場合は、注意が必要です。

Facebook

キーワード【 川俣晶の縁側技術関連執筆情報『VB6プログラマーのための入門Visual Basic.NET独習講座』読者サポート
【『VB6プログラマーのための入門Visual Basic.NET独習講座』読者サポート】の次のコンテンツ
2005年
01月
12日
Decimal型についての訂正
3days 0 count
total 2986 count
【『VB6プログラマーのための入門Visual Basic.NET独習講座』読者サポート】の前のコンテンツ
2004年
07月
10日
IsMissing関数に関する訂正
3days 0 count
total 3732 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20040917142534
サイトの表紙【『VB6プログラマーのための入門Visual Basic.NET独習講座』読者サポート】の表紙【『VB6プログラマーのための入門Visual Basic.NET独習講座』読者サポート】のコンテンツ全リスト 【『VB6プログラマーのための入門Visual Basic.NET独習講座』読者サポート】の入手全リスト 【『VB6プログラマーのための入門Visual Basic.NET独習講座』読者サポート】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.34 (Alpha-Test) Copyright (c) 2004-2018 Pie Dey.Co.,Ltd.