VB脚本中的错误处理子问题

时间:2015-12-15 09:56:40

标签: vbscript

我在我的vb脚本中编写了一个错误处理子

errorNumber = DoAllWork
Sub ErrorHandling (Number, Description, i)
If Number <> 0 Then
   WriteLogFileLine logfile, "Error No : " & Number & " - " & Description & " has occurred !"
Else
   WriteLogFileLine logfile, "Success copying files as Err.Number : " & Err.Number & "Total " & i & " files were copied ! " & vbcrlf
End If
Err.Clear
End Sub

我在我的vb脚本中调用它

Function DoAllWork
    On Error Resume Next
    Err.Clear
    Do Until CopyFiles.AtEndOfStream
        line = CopyFiles.ReadLine
        For Each line In CopyFiles 
            If objFSO.GetFolder(line).Files.Count <> 0 then
                WriteLogFileLine logfile, "Copying files FromLocation " & Chr(34) & line & Chr(34) & " to ToLocation " & Chr(34) & ToLocation & Chr(34)
            Else
                WriteLogFileLine logfile, "No files present in the folder " & Chr(34) & line & Chr(34) & vbcrlf
            End if
            i=0
            For Each File In objFSO.GetFolder(line).Files 
                objFSO.GetFile(File).Copy ToLocation & "\" & objFSO.GetFileName(File),True 
                i=i+1
            Next
            ErrorHandling Err.Number, Err.Description, i
        Next
    Loop
End Function

现在,即使文件已成功复制,正在创建的日志文件也会记录此错误消息。有人可以建议这种错误处理技术有什么问题吗?

2015-12-15 15:03:47 - Copying files FromLocation "\\srv10219\archive\Article\20151116_073104" to ToLocation "C:\Users\TEMPPAHIR\LearnVB\ICCdata\Article"
2015-12-15 15:03:47 - Error No : 438 - Object doesn't support this property or method has occurred !

当我在File.copy语句后直接放置此错误处理时,它会给我这样的日志..

2015-12-15 16:31:55 - Error No : 438 - Object doesn't support this property or method has occurred !
2015-12-15 16:31:55 - Success copying files as Err.Number : 0
2015-12-15 16:31:55 - Total 2 files were copied !

这意味着对于正在复制的第一个文件会抛出错误,对于第二个文件,即使两个文件都已成功复制,它也会成功

1 个答案:

答案 0 :(得分:0)

我实现了这个以完成你所要求的。脚本需要做的是将文件夹及其内容放入目录中,然后将内容复制到正确格式化的新文件夹,其中有一个轮询器,它拾取文件并在我们的系统中输入。我需要脚本来退出任何错误,特别是最后要做的事情。那是从源目录中删除文件夹,但我必须确保它被正确复制。 (您可以清除错误并继续。)

所以在每个重要的行之后,如文件夹创建或文件副本,我做了这个检查。这对我来说可以做错误处理。传递Err对象本身是最好的方法。

Set FolderCreate = FSO.CreateFolder(PreStagingDirectory + "\" + FolderCreateName)
ReportErrors Err,"Error creating folder: " + PreStagingDirectory + "\" + FolderCreateName


FSO.CopyFile objFile.Path, FolderCreate.Path + "\", true
ReportErrors Err,"Error copying file: " + objFile.Path + " to location: " + FolderCreate.Path


Sub ReportErrors(ErrorObject, strExtraInformation)

    'This will log any errors if they happen and the script will then quit
    If ErrorObject.Number <> 0 Then
        OutPutFile.WriteLine(DateTimeString + " Error Number: " & ErrorObject.Number)
        OutPutFile.WriteLine(DateTimeString + " Error (Hex): " & Hex(ErrorObject.Number))
        OutPutFile.WriteLine(DateTimeString + " Source: " &  ErrorObject.Source)
        OutPutFile.WriteLine(DateTimeString + " Description: " &  ErrorObject.Description)
        OutPutFile.WriteLine(DateTimeString + " Other Information: " + strExtraInformation)
        OutPutFile.WriteLine(DateTimeString + " Script is quitting due to the Error Condition.")
        wscript.quit
    End If

End Sub

我也做过这样的代码。在这种情况下,我需要捕获是否从SQL查询返回null到数据库。如果返回null并且我尝试转换值,则会导致错误。

要回答这个问题,您应该检查子中的错误并清除它们,或者通过脚本检查错误,这实际上取决于您需要完成的任务。

首先,我必须说vbscipt中的错误处理很糟糕。使用&#39; On Error Resume Next&#39;,绝对需要,但要小心放置它。我发现最好将它放在main中,顶部,只是在每个函数中。最重要的是要记住范围,如果你把它放在一个函数中,你会在那里捕获错误,并且可以处理它。如果您只将它作为脚本的第一行,则只能处理main中的错误。有时候主要需要它。

同样要调试任何vbscript,注释掉对它的任何调用,否则你永远不会知道这个问题。

    ExecutionString = "select Sum(cast(Frame_Count as int)) from Sop_Instance_T"
    Set objRecordSet = objConnection.Execute(ExecutionString)  


    TotalFrames = cdbl(objRecordSet(0))


    'In case null is returned catch the exception
    'that happens on the above line
    If Err.Number <> 0 Then
        TotalFrames = 0
        Err.Clear ()
    End If