1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: On Error GoTo errorHandler
3: Dim a As Integer, b As Integer
4: a = 1
5: b = 0
6: Trace.WriteLine(a \ b)
7: Exit Sub
8:
9: errorHandler:
10: Trace.WriteLine("Description:")
11: Trace.WriteLine(Err.Description)
12: Trace.WriteLine("HelpContext:")
13: Trace.WriteLine(Err.HelpContext)
14: Trace.WriteLine("HelpFile:")
15: Trace.WriteLine(Err.HelpFile)
16: Trace.WriteLine("LastDllError:")
17: Trace.WriteLine(Err.LastDllError)
18: Trace.WriteLine("Number:")
19: Trace.WriteLine(Err.Number)
20: Trace.WriteLine("Source:")
21: Trace.WriteLine(Err.Source)
22: End Sub
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Try
3: Dim a As Integer = 1, b As Integer = 0
4: Trace.WriteLine(a \ b)
5: Exit Sub
6: Catch ex As DivideByZeroException
7: Trace.WriteLine("HelpLink:")
8: Trace.WriteLine(ex.HelpLink)
9: Trace.WriteLine("Message:")
10: Trace.WriteLine(ex.Message)
11: Trace.WriteLine("Source:")
12: Trace.WriteLine(ex.Source)
13: Trace.WriteLine("StackTrace:")
14: Trace.WriteLine(ex.StackTrace)
15: Trace.WriteLine("TargetSite:")
16: Trace.WriteLine(ex.TargetSite)
17: End Try
18: End Sub
On Error Gotoステートメントはネストできないが、例外ブロックはネストできる。つまり、TryステートメントとEnd Tryステートメントの間に、ほかのTryステートメントとEnd Tryステートメントを入れることができるという意味である。実際に、それを記述した例をリスト9-25に示す。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim a(9) As Integer
3: Try
4: Dim i As Integer
5: For i = 0 To 10
6: Try
7: a(i) = 10 \ i
8: Catch ex As DivideByZeroException
9: a(i) = 0
10: End Try
11: Trace.WriteLine(a(i))
12: Next
13: Catch ex As IndexOutOfRangeException
14: Trace.WriteLine("内部エラー。配列のサイズを確認してください。")
15: End Try
16: End Sub
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim a(9) As Integer
3: Try
4: Dim i As Integer
5: For i = 0 To 10
6: Try
7: a(i) = 10 \ i
8: Catch ex As IndexOutOfRangeException
9: Trace.WriteLine("内部エラー。配列のサイズを確認してください。")
10: End Try
11: Trace.WriteLine(a(i))
12: Next
13: Catch ex As DivideByZeroException
14: Trace.WriteLine("内部エラー。0除算を確認してください。")
15: End Try
16: End Sub
1: Private Sub Calc()
2: Dim a(9) As Integer
3: Dim i As Integer
4: For i = 0 To 10
5: Try
6: a(i) = 10 \ i
7: Catch ex As IndexOutOfRangeException
8: Trace.WriteLine("内部エラー。配列のサイズを確認してください。")
9: End Try
10: Trace.WriteLine(a(i))
11: Next
12: End Sub
13:
14: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
15: Try
16: Calc()
17: Catch ex As DivideByZeroException
18: Trace.WriteLine("内部エラー。0除算を確認してください。")
19: End Try
20: End Sub
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Try
3: Try
4: Dim a As Integer = 1, b As Integer = 0
5: Trace.WriteLine(a \ b)
6: Catch ex As DivideByZeroException
7: Trace.WriteLine("catch by inner block")
8: End Try
9: Catch ex As DivideByZeroException
10: Trace.WriteLine("catch by outer block")
11: End Try
12: End Sub
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Try
3: Try
4: Dim a As Integer = 1, b As Integer = 0
5: Trace.WriteLine(a \ b)
6: Catch ex As Exception
7: Trace.WriteLine("catch by inner block")
8: End Try
9: Catch ex As DivideByZeroException
10: Trace.WriteLine("catch by outer block")
11: End Try
12: End Sub
リスト9-33 内側のCatchブロックでExceptionクラスを指定したプログラム
これを実行すると以下のようになる。
1: catch by inner block
リスト9-34 リスト9-33の実行結果
0除算の例外は、ソース9行目のCatch ex As DivideByZeroExceptionではなく、Catch ex As Exceptionでキャッチされてしまっている。これは、Exceptionクラスを継承して、DivideByZeroExceptionクラスが作られているためである。DivideByZeroExceptionクラスはExceptionクラスとして扱うこともできるので、6行目でDivideByZeroExceptionクラスの例外をキャッチすることができる。