处理VBScript网站中未处理的错误?

时间:2014-03-24 19:54:28

标签: vbscript error-handling

我继承了用几种语言编写的大量难看的代码。用C#编写的混乱部分似乎设置为记录日志文件中大多数未捕获的异常。 VBScript中的程序的另一部分不记录错误。

是否有一些简单的方法可以使VBScript代码捕获所有未捕获的错误并将其记录到某处?我认为答案可能是“不”,因为VBScript没有try-catch,而是“On Error Resume Next”。

编辑:我很清楚VBScript中的错误处理与VB.net完全不同。我只是想知道是否有一些技巧/黑客可以让我处理其他方面未处理的错误。

3 个答案:

答案 0 :(得分:1)

VBScript不支持通过在标签上继续执行来处理错误的概念。换句话说,您不能在VBScript中使用On Error GoTo。而是使用On Error Resume Next,然后检查Err.Number集合的CountErrors属性。

Handling Errors in VBScript

其他可能有助于发现VBScript错误的是使用Option Explicit。它强制显式声明所有变量,并防止意外重用先前声明的变量的名称。此外,如果您错误地键入声明的变量的名称或尝试使用未声明的变量,则会生成错误消息。

答案 1 :(得分:0)

您可以通过多种方式实现,但作为一个简单示例,您可以使用以下方法处理基本错误:

On Error Resume Next

'Insert code to do what you need

If Err.Number <> 0 Then
  WScript.Echo "Error in executing script: " & Err.Number & " - " & Err.Description
  Err.Clear
End If

'Stop doing error handling    
On Error Goto 0

答案 2 :(得分:0)

除了DMasons答案之外,microsoft broke down the removal of "On Error Goto X" command and it's purpose.不幸的是,与许多语言(javascript,C#)不同,它们非常方便和方便&#34; Try {}和Catch {}&#34;参数,vbscript不提供广泛的处理错误分解。是的,错误恢复下一个命令是有效的,其简单的目的,但还有其他方法来处理我发现有用的错误。

例如,您可以使用以下代码更轻松地创建故障排除代码:

<强> Troubleshootvbs.vbs

Const Troubleshoot_this_code = "C:\testenv\testfail.vbs"
Const Place_Results_In = "C:\testenv\troubleshoot.log"

Dim filesystemobject: Set filesystemobject = CreateObject("Scripting.FileSystemObject")
Dim filetotroubleshoot: Set filetotroubleshoot = filesystemobject.OpenTextFile(Troubleshoot_this_code, 1, True)
Dim Troubleshoot_Lines : Troubleshoot_Lines = split(filetotroubleshoot.ReadAll, vbcrlf)
Dim tbl : Set tbl = filesystemobject.OpenTextFile(Place_Results_In, 8, True)

Dim InsertErrorHandling(),IEH,line : Redim InsertErrorHandling(1) : IEH = 1

InsertErrorHandling(0) = "On Error Resume Next"
For each line in Troubleshoot_Lines
    dim errclause : errclause = "if err.number<>0 then : return=" & chr(34) & "Error Found on Line[" & chr(34) & " & IEH & " & chr(34) & "]:" & chr(34) & " & err.number & " & chr(34) & ":" & chr(34) & " & err.description & vbcrlf : err.clear : else : return = IEH & " & chr(34) & ": Clear" & chr(34) & " & vbcrlf : end if : tbl.Writeline return : IEH = IEH + 1"
    InsertErrorHandling(ubound(inserterrorhandling)) = line & vbcrlf & errclause
    Redim Preserve InsertErrorHandling(Ubound(InsertErrorHandling)+1)
Next

dim FullTestCode : FullTestCode = Join(InsertErrorHandling, vbcrlf)
ExecuteGlobal FullTestCode
tbl.close

示例:TestFail.vbs

dim query : query = CreateObject("Scripting.FileSystemObect")
dim result : result = query.CreateTextFile("test.txt")
dim fail : fail = result.readall

示例:Troubleshoot.log

Error Found on Line[1]:429:ActiveX component can't create object

Error Found on Line[2]:424:Object required

Error Found on Line[3]:424:Object required