|
|
連載
プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――
第15回 高度な例外処理
(株)ピーデー
川俣 晶
2002/08/31
|
例外情報の活用
前回の繰り返しにもなるが、errオブジェクトや、例外オブジェクトにはさまざまな有益な情報が含まれている。
VB 6(Visual Basic 6.0)でエラーが発生した場合、エラーに関する情報がerrオブジェクトに格納される。その情報をいくつか表示させてみた例を以下に示す。
1: Private Sub Form_Load()
2: On Error GoTo errorHandler
3: Dim a As Integer, b As Integer
4: a = 1
5: b = 0
6: Debug.Print a \ b
7: Exit Sub
8:
9: errorHandler:
10: Debug.Print "Description:"
11: Debug.Print Err.Description
12: Debug.Print "HelpContext:"
13: Debug.Print Err.HelpContext
14: Debug.Print "HelpFile:"
15: Debug.Print Err.HelpFile
16: Debug.Print "LastDllError:"
17: Debug.Print Err.LastDllError
18: Debug.Print "Number:"
19: Debug.Print Err.Number
20: Debug.Print "Source:"
21: Debug.Print Err.Source
22: End Sub
|
|
errオブジェクトに格納されている情報を表示するVB 6のサンプル・プログラム1 |
これを実行すると以下のような結果になる。
1: Description:
2: 0 で除算しました。
3: HelpContext:
4: 1000011
5: HelpFile:
6: D:\WINNT\Help\VBENLR98.CHM
7: LastDllError:
8: 0
9: Number:
10: 11
11: Source:
12: Project1
|
|
サンプル・プログラム1の実行結果 |
これに相当するソース・コードをVB.NETで記述することは容易である。以下のように記述すれば、ある程度近い結果を容易に得ることができる。
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と同等なVB.NETのサンプル・プログラム2 |
これを実行すると以下のようになる。
1: Description:
2: 0 で除算しようとしました。
3: HelpContext:
4: 0
5: HelpFile:
6:
7: LastDllError:
8: 0
9: Number:
10: 11
11: Source:
12: Sample001n2
|
|
サンプル・プログラム2の実行結果 |
しかし、例外を使用した場合の例外オブジェクトは、errオブジェクトとは必ずしも互換性がない。以下は例外オブジェクトのいくつかのプロパティを表示させてみるサンプル・プログラムである。
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
|
|
例外オブジェクトのプロパティを表示するVB.NETのサンプル・プログラム3 |
これを実行すると以下のようになる。
1: HelpLink:
2:
3: Message:
4: 0 で除算しようとしました。
5: Source:
6: Sample001n
7: StackTrace:
8: at Sample001n.Form1.Form1_Load(Object sender, EventArgs e) in Q:\aWrite\@it\vbn\013\smpl\Sample001n\Form1.vb:line 48
9: TargetSite:
10: Void Form1_Load(System.Object, System.EventArgs)
|
|
サンプル・プログラム3の実行結果 |
見てのとおり、それぞれが扱う情報は同じではない。特に、エラー番号情報の有無や、ヘルプ指定方法の違いなど、コードを機械的に書き換えるだけでは対応できない要素も多い。これらの情報に強く依存することは少ないと思うが、On Error Goto文から例外に変更する場合は、これらの情報に依存していないか事前に確認しておくとよいだろう。
Insider.NET 記事ランキング
本日
月間