プロが教える店舗&オフィスのセキュリティ対策術

VBSでADO接続に失敗した場合にフリーズするのですが、何とか
ならないでしょうか。

以下、わたしのコード(戻り値を返(WSCript.Quit Err.Number)したいので、On Error Resume Nextは外せません。)
Option Explicit
On Error Resume Next
Dim objADO
Set objADO = CreateObject("ADODB.Connection")
objADO.Open "Driver={SQL Server};server=" & WScript.Arguments(0) & _
"; database=" & WScript.Arguments(1) & _
";uid=" & WScript.Arguments(2) & _
";pwd=" & WScript.Arguments(3) & ";"
objADO.Execute(WScript.Arguments(4))
objADO.Close
Set objADO = Nothing
WSCript.Quit Err.Number

A 回答 (1件)

よく、On Error Resume Nextを先頭に置いたスクリプトを見かけますが、


まるで、Option Explicitをスクリプトの先頭に置くような感覚で、
「適当にエラーをリカバるオプション」のような誤解があるのではないでしょうか。

On Error Resume Nextの意味は、言わば、
「エラーがあっても無視して、どうなってもいいから暴走しろ」ですから、
そんな、自暴自棄に走らなくても、と思ってしまいます。
そのような時は、きちんとエラー判定を行い、適切な処理をしましょう。
例1では、Openしかエラー判定を行っていませんが、Executeもエラーが起こりそうなのでエラー判定を行ってください。
ようは、Resume Nextを使うなら、エラーが起こりそうなところで、適切なエラー処理を行わなければいけないと言うことです。

例1
sub 処理1
Option Explicit
On Error Resume Next
Dim objADO
Set objADO = CreateObject("ADODB.Connection")
objADO.Open "Driver={SQL Server};server=" & WScript.Arguments(0) & _
"; database=" & WScript.Arguments(1) & _
";uid=" & WScript.Arguments(2) & _
";pwd=" & WScript.Arguments(3) & ";"
if Err.Number <> 0 then
else
objADO.Execute(WScript.Arguments(4))
objADO.Close
end if
Set objADO = Nothing
WSCript.Quit Err.Number
End Sub

例2
sub 処理1
Option Explicit
'On Error Resume Next
On Error GoTo Err処理
Dim objADO
Set objADO = CreateObject("ADODB.Connection")
objADO.Open "Driver={SQL Server};server=" & WScript.Arguments(0) & _
"; database=" & WScript.Arguments(1) & _
";uid=" & WScript.Arguments(2) & _
";pwd=" & WScript.Arguments(3) & ";"
objADO.Execute(WScript.Arguments(4))
objADO.Close
Set objADO = Nothing

Exit Sub
Err処理:
Set objADO = Nothing
WSCript.Quit Err.Number
End Sub

注:全角空白があるのでそのまま貼り付けないで。
    • good
    • 1
この回答へのお礼

わたしの求めている回答のほか、プログラミングをする上での哲学まで教えて頂き非常に感謝しております。残念ながら、わたしの周囲にはあなたのようなプログラマーはおりません。

お礼日時:2008/01/02 02:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!