gpt4 book ai didi

VBA 异常通过处理程序

转载 作者:行者123 更新时间:2023-12-03 08:48:59 26 4
gpt4 key购买 nike

我继承了一个可怕的 Excel VBA 应用程序,它是由一个显然不喜欢函数和注释的人编写的。打开源代码就像凝视着一个疯狂的深渊,9 级的 hell 压痕等待着将粗心的人困住。

首先,设置。

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

    ' 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 的错误处理模型的怪物相对较新,但我不相信我做错了什么。我在这里错过了一些微妙之处吗?异常如何能够绕过我的处理程序并像这样冒泡堆栈?我不相信函数值的赋值或传递会导致问题,因为它们只是一个 bool 值和字符串值。该问题也是间歇性的,仅当我们在该程序将文件复制到的目录上启用了文件同步软件时才会出现。

最佳答案

所以在我发布这个几个小时后,我设法弄清楚了。

调试按钮不在错误框上的原因是因为在选项中错误捕获设置为“在未处理的错误时中断”。将其更改为“Break in Class Module”会使按钮恢复原状。

异常绕过我的错误处理程序的原因是它们发生在我的 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)

注意 New 的添加, Set , 和 CStr .

问题解决了。

关于VBA 异常通过处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46411104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com