On Error Goto 0,on error resume next, Errの使い方

On Error Resume Next、On Error Goto 0、Errを簡単に説明します。

On Error Resume NextステートメントとOn Error Goto 0ステートメントは、[実行時エラー]が発生した場合の対処方法を表示しています。

On Error Resume Nextステートメントを追加した後、次のプログラムが[実行時エラー]と表示された場合、中断しないで継続的に実行します。

On Error Goto 0ステートメントを追加した場合、次のプログラムで[実行時エラー]が発生すると、[エラーメッセージ]が表示され、プログラムが中止されます。

Errオブジェクトは[エラーメッセージ]を保存します。

On Error Resume Next、On Error Goto 0、Err、この3つのステートメントの例を挙げて説明します。
On Error Resume Nextステートメントが追加されていません。

On Error Resume Nextステートメントが追加されていない場合、[実行時エラー]が発生すると、[エラー]が表示され、プログラムの実行が中止します。

例:

i = 1/0  '0は除数で、[実行時エラー]を生成し、[エラーメッセージ]を表示して、プログラムの実行を中止します。

結果:

Microsoft VBScript[実行時エラー] エラー'800a000b'
0で割ります。

Add On Error ResumeNextステートメントを追加します。

どこかにOn Error Resume Nextステートメントを追加すると、後続のプログラムに[実行時エラー]があったとしても、[エラーメッセージ]は表示されず、実行を継続します。

例:

On Error Resume Next '次のプログラムは[実行時エラー]が発生しても、実行を継続します。
i = 1/0 '0は除数で、これは[実行時エラー]の1つですが、上記のOn Error Resume Nextを追加したため、エラーが発生しても、プログラムは中断されず、実行を継続します。
MsgBox "除算が実行されました" , , "メッセージを表示します"   'このメッセージは実行されます。

結果:

除算が実行されました

On Error Resume Nextステートメントを追加した後、Errオブジェクトを使用してエラーメッセージを取得します。

On Error Resume Nextを追加した後、エラーが発生した場合、最新のエラーメッセージがErrオブジェクトに配置されます。

Errオブジェクトには、Number, Source, Descriptionの3つの重要な属性があります。それぞれ、エラーコード、エラーソース、およびエラーの説明です。

表示できるのは[実行時エラー]だけであり、そしてIf Err thenはIf Err.Number thenと同じです。

Dim i
i = 1/0 '最初のエラー
undefined_function "test" '2番目のエラー、関数undefined_functionが定義されていません
MsgBox Err.Description, , "メッセージを表示します"

実行結果:

型の不一致でエラー発生

ご覧のとおり、表示されたエラーは[0で除算しました]ではありません。

On Error Goto 0ステートメントを使用して、システムにエラー処理をテークオーバーします。

On Error Resume Nextステートメントを追加すると、次のプログラムは[実行時エラー]が発生しても実行を継続しますが、[実行時エラー]が発生したときに次のプログラムの実行を中止してエラーを表示したい場合はどうすればよいですか?

正解: OnErrorGoto0ステートメントを使用します。

On Error Goto 0ステートメントを使用した後、次のプログラムはエラーが発生すると、エラーが表示され、スクリプトの実行が終了します。

Dim i
i = 1/0
MsgBox "最初の除算を実行しました。", , "メッセージを表示します"
On Error Goto 0 '次のステートメントはエラーが発生すると、エラーが表示され、スクリプトの実行が終了します。
i = 1/0
MsgBox "2番目の除算を実行しました。", , "メッセージを表示します"

実行の結果:

最初の除算を実行しました
Microsoft VBScript[実行時エラー] エラー'800a000b'
0で割ります。

ご覧のとおり、最初のMsgBoxはコンテンツを実行して表示しましたが、2番目のMsgBoxは実行されませんでした。

On Error Resume Nextについて詳しく説明します

On Error Resume Nextステートメントの使用範囲

On Error Resume Nextステートメントは、このレベルの後続のステートメントにのみ適用されます。 呼び出された関数またはサブプログラムには影響せず、親プログラミングにも影響しません。

On Error Resume Nextステートメントが関数に表示されている場合、この関数のみ影響します。[メインファンクションコール]と[呼び出された関数] には影響ありません。

サブプログラムにOn Error Resume Nextステートメントがない場合、サブプログラムでエラーが発生すると、このサブプログラムの操作は中断され、このサブプログラムを呼び出した外部プログラムにジャンプします。外部プログラムは[エラーが発生した関数]を呼び出す前にOn Error Resume Nextステートメントがある場合、[関数を呼び出し]の後のステートメントが実行されます。外部プログラムは[エラーが発生した関数]を呼び出す前にOn Error Resume Nextステートメントがない場合は、外部層にジャンプします。 このプロシージャは、On Error Resume Nextステートメントを含む環境が見つかるまで繰り返され、On Error Resume Nextステートメントを含む環境が見つかると実行を継続します。最も外側のプログラムにOn Error Resume Nextステートメントが含まれていない場合は、デフォルトのエラーハンドラーが使用されます。つまり、エラーメッセージが表示され、実行を中止します。

例:

Dim i
i = 1/0
MsgBox "OK", , "メッセージを表示します"
Sub test1()
test
MsgBox "OK", , "メッセージを表示します"
End Sub
On Error Resume Next
test1

結果:

 

二つのokは印刷されていません。On Error Resume Nextは最外層で実行されるため、呼び出されたサブプログラムで問題が発生すると、サブプログラムから直接外部コードにジャンプします。

サブプログラムの先頭にOn Error Resume Nextステートメントを配置した場合、発生した[実行時エラー]はサブプログラムを中止しません。

例えば、ファイルに文字列を書き込む必要がある場合は、別の関数を使用してファイルにアクセスし、エラーによるプログラム全体の中断を防ぐことができます。

'returns True if it succeeds, or False on any error
Function WriteNewFile(strFileName, strContent)
On Error Resume Next 'turn off the default error handler
WiteNewFile = Flase 'default return value of function
Set objFSO = CreateObject("scripting.FileSystemObject")
If Err.Number = 0 Then Set objFile = objFSO.CreateTextFile(strFileName,True)
If Err.Number = 0 Then objFile.WriteLine strContent
If Err.Number = 0 Then objFile.Close
If Err.Number = 0 Then WriteNewFile = True
End Function

上記のプログラムは、各プログラムステートメントを処理する前に、ErrオブジェクトのNumberプロパティをチェックします。値が0の場合(エラーは発生していません)、ファイルの作成と書き込みを続行できます。エラーが発生した場合、スクリプトはErrオブジェクトのプロパティの値を設定し、次の行の処理を続行します。

エラーを発生しないで、正常に実行できる限り、関数の返す値は“True”に設定されます。それ以外の場合、関数は“False”を返します。

On Error Goto 0ステートメント

On Error Goto 0ステートメントは、デフォルトのエラー処理操作を復元できます。

このステートメントを実行した後、実行時エラーが発生すると、デフォルトのエラー処理が発生し、ネストされた各プログラムは、メインコードまで環境チェーンでチェックします。他の環境でデフォルトのエラー処理をオフにしていない場合、実行は中止します。

Errオブジェクト

上記の例では、デフォルトのエラー処理をオフにした後、ErrオブジェクトのNumberプロパティをチェックすることによって、エラーが発生したかどうかを確認します。

Errオブジェクトは、実行時エラーに関する情報を格納します。

次のテーブルは、Errオブジェクトによって提供されるプロパティを表示しています。

Descriptionエラーを説明する文字列を設定または返す
Number(デフォルトプロパティ)エラー値を設定または返す
Sourceエラーが発生する元のオブジェクトの名前を設定または返す

これらのプロパティを使用して、発生したエラーの種類を確認できます。例えば、エラーコードに応じてさまざまな解決策を使用できます。また、SourceとDescriptionのプロパティを使用して、ユーザーにエラーメッセージを提供できます。

次のテーブルには、Errオブジェクトによって提供されるメソッドを表示しています。

Clear 現在のErrオブジェクト設定をすべてクリア
Raise実行時エラーを生成する

Errオブジェクトを使用して、[ユーザー定義エラー]を生成します。

Errオブジェクトを使用して、[ユーザー定義エラー]を生成できます。これをする原因は何ですか?定義エラーメッセージをユーザーに伝えたい場合があるためです。Errオブジェクトのプロパティを任意の値に設定してから、Raiseメソッドを呼び出してこのようなエラーを生成できます。そうすると、プログラムが停止し、コールチェーンに沿ってエラーが返されます。

次の例では、サーバーディスク上のテキストファイルを読み取るときにエラーを処理する方法を示しています。定数vbObjectErrorを使用して、選択したエラーコードを既存のエラーコードと混同されないように注意してください。 任意に選択したエラーコードをこの定数に追加することにより、事前定義エラーと混同されません。

Set objFSO = CreateObject("scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("strFileName", ForReading)
Select Case Err.Number
Case 0 'OK, take no action
Case 50,53 'standard file or path not found errors
'create custom error values and raise error back up the call chain
intErrNumber = vbObjectError + 1073 'custom error number
strErrDescription = "The file has been deleted or moved. "
strErrSource = " ReadThisFile function"
Err.Raise intErrNumber, strErrSource, strErrDescription
Exit Function
Case Else 'some other error
'raise the standard error back up the call chain
Err.Raise Err.Number, Err.Source, Err.Description
Exit Function
End Select
ReadThisFile = objFile.ReadAll ' we opened it OK, so return the content
objFile.Close
End Function

この関数のコードを呼び出すと、On Error Resume Nextステートメントを使用でき、この関数によって生成されたエラーをキャッチできます。

strContent = ReadThisFile("myfile.txt")
If Err.Number = 0 Then
MsgBox "File content is:
" & strContent, , "メッセージを表示します"
Else
MsgBox Err.Source & "
" & Err.Description, , "メッセージを表示します"
End If
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です