例外クラス
前節で見たように、.NET Frameworkで用意されているメソッドで発生する可能性があるものは、MSDNライブラリーに説明が載せられているので、その例外クラス名を使用して例外処理を記述できます。例外処理はそれ以外にも、自分で例外クラスを作って、発生(スロー)させることもできます。
例外クラスを作成するには次のように記述します。
自分で作った例外クラスは自分でスローしなくてはなりません。例外をスローするには次のように記述します。
ここで、先回作成したBusクラスを修正しましょう。今までは、乗車や降車をするときに走っていないかどうかなどを調べ、異常がある場合はその旨のメッセージを返すように作ってきました。それを例外処理に書き換えましょう。
○ プロジェクト
プロジェクトを作成して確認してみましょう。
プロジェクトの種類 |
コンソール アプリケーション |
プロジェクト名 |
ThrowTest |
サンプルダウンロード
○ 作成の準備
「InheritanceTest」プロジェクトを修正して作成しましょう。InheritanceTestフォルダーをコピーして、作成するプロジェクト名にフォルダー名を変更してください。
○ プログラム
例外を表すクラスを作成しましょう。Exceptionクラスを継承した次のようなクラスを作成してください。
WarningException.vb
- Public Class WarningException
- Inherits Exception
- Public Sub New(errormessage As String)
- MyBase.New(errormessage)
- End Sub
- End Class
○ 解説
2行目でスーパークラスにExceptionクラスを指定しています。それにより今回作成したWarningExceptionクラスはスローしてキャッチすることができるようになります。例外を表すクラスは多くの場合~Exceptionのように名前を付けます。
4~6行目ではコンストラクタを定義しています。このコンストラクタはインスタンス生成時にスーパークラスであるExceptionクラスのコンストラクタを呼び出しています。引数として受け取ったエラーメッセージをさらに引数として渡しています。これによりMessageプロパティで、引数で指定したエラーメッセージが参照できるようになります。
○ プログラム
次にBusクラスを変更しましょう。次のように修正してください。
Bus.vb
- Public Class Bus
- Inherits Car
- 'プロパティ==========
- Public Property SalesAmount As Integer '運賃
- Public Property PassengerNumber As Integer '乗客人数
- 'コンストラクタ==========
- Public Sub New()
- Me.New(100)
- End Sub
- Public Sub New(gas As Double)
- MyBase.New(gas)
- Me.SalesAmount = 0
- Me.PassengerNumber = 0
- End Sub
- 'メソッド==========
- '乗車させるメソッドAs String
- Public Sub RideToBus(fare As Integer)
- '走行中かどうか
- If Me.Speed <> 0 Then
- Throw New WarningException("停車してください。")
- End If
- '満席かどうか
- If Me.PassengerNumber >= 50 Then
- Throw New WarningException("満席のため、乗車できません。")
- End If
- '料金と、乗車人数を加算
- Me.SalesAmount += fare
- Me.PassengerNumber += 1
- End Sub
- '降車させるメソッド
- Public Sub GetOffBus()
- '走行中かどうか
- If Me.Speed <> 0 Then
- Throw New WarningException("停車してください。")
- End If
- '乗客がいるかどうか
- If Me.PassengerNumber = 0 Then
- Throw New WarningException("乗客はいません。")
- End If
- '乗車人数を減算
- Me.PassengerNumber -= 1
- End Sub
- End Class
○ 解説
20、35行目では、処理の中でエラーが発生した場合は文字列を返す仕組みから例外をスローする仕組みに変更するため、戻すデータがなくなりました。そのため、プロシージャの種類をFunctionからSubに変更しています。
23、27、38、42行目では、エラーが発生した場合にその時のエラーメッセージをReturn文で返していましたが、Throw文を使って例外をスローさせるように変更しました。
○ プログラム
次にMainソッドを変更しましょう。次のように修正してください。
Module1.vb
- Module Module1
- '車の状態を表示するメソッド
- Sub ShowData(c As Bus)
- Console.WriteLine("スピード:{0}km", c.Speed)
- Console.WriteLine("ガソリン:{0}L", c.Gas)
- Console.WriteLine("売上金額:{0}円", c.SalesAmount)
- Console.WriteLine("乗車人数:{0}人", c.PassengerNumber)
- End Sub
- Sub Main()
- 'インスタンスを生成する
- Dim obj As New Bus(150)
- '現在の状態を表示する
- ShowData(obj)
- While True
- Try
- '操作を入力
- Console.Write("1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:")
- Dim inputdata As String = Console.ReadLine()
- '操作によって分岐する
- Select Case inputdata
- Case "1"
- '加速する
- obj.SpeedUp(5)
- ShowData(obj)
- Case "2"
- '減速する
- obj.SpeedDown(5)
- ShowData(obj)
- Case "3"
- '給油する
- 'obj.SetGas(35)
- obj.Gas = 80
- ShowData(obj)
- Case "7"
- '乗車する
- obj.RideToBus(200)
- ShowData(obj)
- Case "8"
- obj.GetOffBus()
- ShowData(obj)
- Case "9"
- 'プログラムを終了する
- Return
- End Select
- Catch ex As WarningException
- Console.WriteLine(ex.Message)
- Catch ex As Exception
- Console.WriteLine("エラーが発生しました。")
- Console.WriteLine(ex.Message)
- End Try
- End While
- End Sub
- End Module
○ 解説
19~55行目では、Try~Catch文が記述されています。41、44行目で、バスオブジェクトのメソッドが呼び出されると、状態によって例外(WarningException)がスローされてきます。その場合は、50行目でキャッチされ、51行目の処理が行われます。52行目はWarningException以外がTry文の中でスローされたときにキャッチされます。
Catch文は複数指定することができます。Try文でスローされた例外オブジェクトに応じてキャッチされます。それぞれのCatch文が上から順に評価されていきます。そのため、Exception型のCatchは最後に指定しないと警告が表示されます。上の方にExeption型の指定をすると必ずそこでキャッチされ、下に指定したCatch文は使われないからです。
前へ 次へ