連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

第15回 高度な例外処理

(株)ピーデー
川俣 晶
2002/08/31

Page1 Page2 Page3

例外情報の活用

 前回の繰り返しにもなるが、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文から例外に変更する場合は、これらの情報に依存していないか事前に確認しておくとよいだろう。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第15回 高度な例外処理
  1.例外情報の活用
    2.ネストした例外処理
    3.例外の再発生
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間