我继承了用几种语言编写的大量难看的代码。用C#编写的混乱部分似乎设置为记录日志文件中大多数未捕获的异常。 VBScript中的程序的另一部分不记录错误。
是否有一些简单的方法可以使VBScript代码捕获所有未捕获的错误并将其记录到某处?我认为答案可能是“不”,因为VBScript没有try-catch,而是“On Error Resume Next”。
编辑:我很清楚VBScript中的错误处理与VB.net完全不同。我只是想知道是否有一些技巧/黑客可以让我处理其他方面未处理的错误。
答案 0 :(得分:1)
VBScript不支持通过在标签上继续执行来处理错误的概念。换句话说,您不能在VBScript中使用On Error GoTo
。而是使用On Error Resume Next
,然后检查Err.Number
集合的Count
和Errors
属性。
其他可能有助于发现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