よく、On Error Resume Nextを先頭に置いたスクリプトを見かけますが、
まるで、Option Explicitをスクリプトの先頭に置くような感覚で、
「適当にエラーをリカバるオプション」のような誤解があるのではないでしょうか。
On Error Resume Nextの意味は、言わば、
「エラーがあっても無視して、どうなってもいいから暴走しろ」ですから、
そんな、自暴自棄に走らなくても、と思ってしまいます。
では、どう書くのが清く、正しく、安全か、というと、
例えば、リネーム、
Set fo=fso.GetFile(filename)
fo.Name=newName
は、同じ名前があるとエラーになります。
そこで、まず、
Set fo=fso.GetFile(filename)
Sub Rename(fo,newName)
On Error Resume Next
fo.Name=newName
End Sub
Call Rename(fo,newName)
If Err<>0 Then
WScript.Echo Err.Number & " : " & Err.Description
WScript.Quit
End If
と変えて、Err.Numberを調べます。すると、58と分かります。
最終的に、
Set fo=fso.GetFile(filename)
Sub Rename(fo,newName)
On Error Resume Next
fo.Name=newName
End Sub
Call Rename(fo,newName)
If Err=58 Then
' 同名ファイルがあったときの処理
ElseIf Err<>0 Then
WScript.Echo Err.Number & " : " & Err.Description
WScript.Quit
' または Err.Raise Err.Number でも可。
End If
のようにします。
ポイントは、
エラーの想定される行だけに局限する。
想定されるエラーだけに局限する。
WSH2.0でOn Error GoTo 0が追加されましたが、要らんことです。
例えば、
Set fo=fso.GetFile(filename)
On Error Resume Next
fo.Name=newName
On Error GoTo 0
If Err<>0 Then
とすると、Err.Numberが分からなくなります。
また、
Set fo=fso.GetFile(filename)
On Error Resume Next
fo.Name=newName
'++++++++++++++++++++
If Err=58 Then
' 同名ファイルがあったときの処理
ElseIf Err<>0 Then
WScript.Echo Err.Number & " : " & Err.Description
WScript.Quit
End If
'++++++++++++++++++++
On Error GoTo 0
とすると、この区間でエラーを起こしても無視して暴走です。
どちらももうひとつです。
因みに、JScriptのtry catch風をVBScriptでお望みの場合、
Sub Try()
'
' ここにtryのコード
'
End Sub
Sub Catch()
On Error Resume Next
Call Try()
End Sub
Call Catch()
If Err<>0 Then
'
' ここにcatchのコード
'
End If
で、似たようなことが出来ます。
これでErr.NumberやErr.Descriptionは分かりますが、
一番知りたい、エラーを起こしたソース行番号が分かりません。
で、やっぱり、お勧めは最初に述べた通りです。