VBA异常通过处理程序滑动

时间:2017-09-25 17:41:51

标签: vba excel-vba error-handling exception-handling excel

我继承了一个 hideous Excel VBA应用程序,由一个显然不喜欢函数和注释的人编写。打开源代码就像是凝视着疯狂的深渊,有9级地狱缩进等待陷阱的不小心。

首先是设置。

在调试间歇性问题的过程中,我已将主要功能中的特定行标识为其位置。由于异常对我来说不容易修复,我给了这一行,只有这一行,一个显示自定义消息的错误处理程序。

    ' Lots of stuff cut out
    On Error GoTo TechReleaseBuildError
    lb_Err1 = BuildDirectories(gj_TechBld.mt_TechRlsOutDir)
    On Error GoTo 0
    ' Lots of stuff cut out
    Exit Sub
TechReleaseBuildError:
    MsgBox "Error building tech release. Pause the synchronization software and try again."
    Stop
    Resume
End Sub

StopResume仅用于帮助调试,因为弹出的正常错误消息没有调试错误的选项。

BuildDirectories函数中,我已经确定了一行导致错误被引发到主要功能。我也在这个函数中放置了错误处理程序。

    ' Lots of stuff cut out
    Exit Function
TEST:
    Stop
    Resume

SynchroRetry:
    Dim CurrentError As ErrObject
    CurrentError = Information.err
    SynchroRetryCounter = SynchroRetryCounter + 1
    Debug.Print "Synchro Error, retrying #" + SynchroRetryCounter
    Stop
    If SynchroRetryCounter > 5 Then
        Stop
        Information.err.Raise CurrentError.Number, CurrentError.Source, CurrentError.Description, CurrentError.HelpFile, CurrentError.HelpContext
    Else
        Application.Wait Now + #12:00:03 AM#
        Resume
    End If

End Function

BuildDirectories的最开始,我已经将On Error GoTo TEST语句作为一个包含所有错误处理程序,因此我可以识别它们来自哪些行,并且还使用了SynchroRetry处理程序我已经知道的行导致了一个问题,我立即重置回TEST处理程序。 SynchroRetry处理程序只等待3秒并重试,在第5次重试后失败。

' For some reason, this line (and only this line so far) causes problems when synchronization software is running.
' The error handler waits for a few seconds then tries again a few times.
Dim SynchroRetryCounter As Integer
SynchroRetryCounter = 0
On Error GoTo SynchroRetry
lj_FSO.CopyFile Source:=lt_RPOFilePath & lt_RPOFileName, Destination:=lt_VinRposDir & "\" & lt_RPOFileName, OverWriteFiles:=True ' Trouble line
On Error GoTo TEST

我已经通过Find验证了这些是函数中唯一的3个On Error语句(模块中唯一的语句,甚至)。除了显示的两个函数之外,顶级函数也没有On Errors

简而言之,顶级函数只在一行上有一个错误处理程序,它所包含的函数在其中也有两个错误处理程序,一个用于其中一个已知的麻烦行和一个应该包含的一般错误处理程序整个功能。

问题在于发生了一些错误,导致我“构建技术版本时出错”。要显示的消息,但似乎没有触发TEST或SynchroRetry错误处理程序。我无法想象这是如何可能的。我对VBA的错误处理模型的怪异相对较新,但我不相信我做错了什么。我在这里想念一些微妙的东西吗?一个异常如何绕过我的处理程序并像这样冒泡堆栈?我不相信函数值的赋值或传递可能会导致问题,因为它们只是一个布尔值和字符串值。该问题也是间歇性的,只有当我们在该程序将文件复制到的目录上激活文件同步软件时才会出现此问题。

1 个答案:

答案 0 :(得分:0)

在我发布这篇文章几个小时后,我设法弄明白了。

调试按钮不在错误框上的原因是因为在选项中错误陷阱设置为"中断未处理错误"。将其改为"打破课堂模块"把按钮拉回来。

异常绕过我的错误处理程序的原因是因为它们发生在我的SynchroRetry错误处理程序中。特别是,我不得不改变前几行:

Dim CurrentError As ErrObject
CurrentError = Information.err
SynchroRetryCounter = SynchroRetryCounter + 1
Debug.Print "Synchro Error, retrying #" + SynchroRetryCounter

到此:

Dim CurrentError As New ErrObject
Set CurrentError = Information.err
SynchroRetryCounter = SynchroRetryCounter + 1
Debug.Print "Synchro Error, retrying #" + CStr(SynchroRetryCounter)

请注意添加NewSetCStr

问题解决了。