2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

« すべてのゾーン/すべてのレベルで「拡張子ではなく、内容によってファイルを開くこと」を「無効にする」べし。 | トップページ | 「拡張子ではなく、内容によってファイルを開くこと」は『クロスサイトスクリプティングを許すこと』と同じ。 »

2006年12月 4日 (月)

On Error Resume Nextの正しい使い方

よく、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は分かりますが、
一番知りたい、エラーを起こしたソース行番号が分かりません。

で、やっぱり、お勧めは最初に述べた通りです。

« すべてのゾーン/すべてのレベルで「拡張子ではなく、内容によってファイルを開くこと」を「無効にする」べし。 | トップページ | 「拡張子ではなく、内容によってファイルを開くこと」は『クロスサイトスクリプティングを許すこと』と同じ。 »