サンプル
コードのダウンロード (vbmigtips_Error.exe, 90.7 KB)
アプリケーションでエラー
(例外) が発生する場合があります。たとえば、指定したファイルが存在しないのにファイルを開く処理を実行しようとすると、図1
のようなエラーメッセージが表示されます。
.gif)
図1
図1
のようなエラーメッセージを表示させないためには、プロジェクト内でエラーを正しくハンドリングする必要があります。そこで今回は、Visual
Basic 6.0 と Visual Basic .NET
それぞれのエラー発生時のハンドリング方法を紹介します。
Visual Basic 6.0 では On Error GoTo
という構文を使用します。たとえば、test.txt ファイルを開くプロジェクトを実行し、指定した test.txt
ファイルが存在しなかった場合、エラーが発生します。その際に実行する例外処理の実装は以下のとおりです。
| Private Sub Command1_Click() On Error GoTo
ErrorHandler Open
"C:\Foo\test.txt" For Input As #1 Close #1 Exit Sub ErrorHandler: MsgBox
(Err.Description) End
Sub |
リスト1
On Error GoTo
は、エラーが発生すると指定したラベルの処理がジャンプします。上記 (リスト1)
では、エラーが発生すると、「ErrorHandler:」へジャンプし処理を行います。たとえば、C ドライブの Foo フォルダに
test.txt がない状態で、リスト1 のアプリケーションを実行すると、図2
のようにエラーの概要がメッセージボックスで表示されます。
.gif)
図2
On Error
GoTo は、Visual Basic .NET でも使用することができます。しかし、Visual Basic .NET
では、「構造化例外処理」という新しいエラー処理機能がサポートされました。続いては、Visual Basic .NET で Try ...
Catch ステートメントを利用したエラーの例外処理方法を紹介します。Try ... Catch
ステートメントを使用した例外処理の実装コードは以下のとおりです。
| Private Sub Button1_Click(ByVal
sender As System.Object, ByVal e As System.EventArgs) Handles
Button1.Click Dim fileno As
Integer fileno =
FreeFile() Try FileOpen(fileno,
"C:\Foo\test.txt", OpenMode.Input) Catch ex As
Exception MessageBox.Show(ex.Message) End Try End
Sub |
リスト2
Try
ブロックの処理中にエラーが発生した場合、Catch ステートメントから End Try
ステートメントまでの処理が実行されます。たとえば、C ドライブの Foo フォルダに test.txt がない状態で、リスト2
のアプリケーションを実行すると、図3 のようにエラーの概要がメッセージボックスで表示されます。
.gif)
図3
リスト1 やリスト2
ではエラー内容が異なっても、すべて同じ処理を行います。しかし、エラー内容によって異なる処理を行いたい場合もあるでしょう。そこで、エラーによってそれぞれ異なる処理が行えるように変更します。
Visual
Basic 6.0 の場合、リスト1の「ErrorHandler:」以下を下記のように変更します。
| ErrorHandler: If Err = 53
Then MsgBox
"text.txt ファイルがありません。" ElseIf Err = 76
Then MsgBox "C:\Foo
が見つかりません。" Else MsgBox
(Err.Description) End If End
Sub |
リスト3
リスト3 のように Visual
Basic 6.0 では If 文とエラー番号を使用してエラーの種類を判別します。一方の Visual Basic .NET では If
文を使用せず、例外オブジェクトの種類を判別します。実装コードは下記のように変更します (太字がリスト2
の変更箇所です)。
| Private Sub Button1_Click(ByVal
sender As System.Object, ByVal e As System.EventArgs) Handles
Button1.Click Dim fileno As
Integer fileno =
FreeFile() Try FileOpen(fileno,
"C:\testaa.txt", OpenMode.Input) Catch ex As
System.IO.FileNotFoundException MessageBox.Show("text.txt
ファイルがありません。") Catch ex As
System.IO.DirectoryNotFoundException MessageBox.Show("C:\Foo
が見つかりません。") Catch ex As
Exception MessageBox.Show(ex.Message) End Try End
Sub |
リスト4
これにより、test.txt
ファイルが存在しない場合は、「text.txt ファイルがありません。」というメッセージボックスが表示され、C:\Foo
フォルダが存在しない場合は、「C:\Foo
が見つかりません。」というメッセージボックスが表示されるようになります。