我想使用 VBScript 来捕获错误并记录它们(即在错误“记录某些东西”时),然后恢复脚本的下一行。
例如,
出错时继续下一步 '执行步骤 1 '执行第 2 步 '执行第 3 步
当第 1 步发生错误时,我希望它记录该错误(或使用它执行其他自定义功能)然后在第 2 步恢复。这可能吗?我该如何实施?
编辑:我可以做这样的事情吗?
错误恢复 myErrCatch '执行步骤 1 '执行第 2 步 '执行第 3 步 我的错误捕获: '记录错误 继续下一步
我想使用 VBScript 来捕获错误并记录它们(即在错误“记录某些东西”时),然后恢复脚本的下一行。
例如,
出错时继续下一步 '执行步骤 1 '执行第 2 步 '执行第 3 步
当第 1 步发生错误时,我希望它记录该错误(或使用它执行其他自定义功能)然后在第 2 步恢复。这可能吗?我该如何实施?
编辑:我可以做这样的事情吗?
错误恢复 myErrCatch '执行步骤 1 '执行第 2 步 '执行第 3 步 我的错误捕获: '记录错误 继续下一步
VBScript 没有抛出或捕获异常的概念,但运行时提供了一个全局 Err 对象,该对象包含上次执行的操作的结果。您必须在每次操作后显式检查 Err.Number 属性是否非零。
On Error Resume Next
DoStep1
If Err.Number <> 0 Then
WScript.Echo "Error in DoStep1: " & Err.Description
Err.Clear
End If
DoStep2
If Err.Number <> 0 Then
WScript.Echo "Error in DoStop2:" & Err.Description
Err.Clear
End If
'If you no longer want to continue following an error after that block's completed,
'call this.
On Error Goto 0
Visual Basic 和 Visual Basic for Applications (VBA) 支持“On Error Goto [label]”语法,但 VBScript 不支持此语言功能,因此您必须如上所述使用 On Error Resume Next。
请注意,这On Error Resume Next
不是全局设置的。您可以将代码的不安全部分例如放入一个函数中,如果发生错误,该函数将立即中断,并从包含先例OERN
语句的 sub 调用此函数。
ErrCatch()
Sub ErrCatch()
Dim Res, CurrentStep
On Error Resume Next
Res = UnSafeCode(20, CurrentStep)
MsgBox "ErrStep " & CurrentStep & vbCrLf & Err.Description
End Sub
Function UnSafeCode(Arg, ErrStep)
ErrStep = 1
UnSafeCode = 1 / (Arg - 10)
ErrStep = 2
UnSafeCode = 1 / (Arg - 20)
ErrStep = 3
UnSafeCode = 1 / (Arg - 30)
ErrStep = 0
End Function
您可以在外观函数中重新组合您的步骤函数调用:
sub facade()
call step1()
call step2()
call step3()
call step4()
call step5()
end sub
然后,让您的错误处理在调用外观的上层函数中:
sub main()
On error resume next
call facade()
If Err.Number <> 0 Then
' MsgBox or whatever. You may want to display or log your error there
msgbox Err.Description
Err.Clear
End If
On Error Goto 0
end sub
现在,让我们假设step3()
引发了一个错误。由于facade()
不处理错误(没有 On error resume next
in ) ,facade()
错误将被返回main()
并且不会被执行。step4()
step5()
您的错误处理现在在 1 个代码块中重构
我对 VBScript 非常陌生,所以这可能不被认为是最佳实践,或者可能有原因不应该以我还不知道的方式这样做,但这是我想出的修剪解决方案减少我的主代码块中的错误记录代码量。
Dim oConn, connStr
Set oConn = Server.CreateObject("ADODB.Connection")
connStr = "Provider=SQLOLEDB;Server=XX;UID=XX;PWD=XX;Databse=XX"
ON ERROR RESUME NEXT
oConn.Open connStr
If err.Number <> 0 Then : showError() : End If
Sub ShowError()
'You could write the error details to the console...
errDetail = "<script>" & _
"console.log('Description: " & err.Description & "');" & _
"console.log('Error number: " & err.Number & "');" & _
"console.log('Error source: " & err.Source & "');" & _
"</script>"
Response.Write(errDetail)
'...you could display the error info directly in the page...
Response.Write("Error Description: " & err.Description)
Response.Write("Error Source: " & err.Source)
Response.Write("Error Number: " & err.Number)
'...or you could execute additional code when an error is thrown...
'Insert error handling code here
err.clear
End Sub