2

我遇到过几次这个问题,但一直无法解决,但现在我需要一劳永逸地解决它。

我有一个程序一直在抛出运行时错误。这不是问题,因为我在函数顶部定义了一个错误处理程序,在底部定义了一个处理程序,如下所示:

retryConcat:
On Local Error GoTo concatErr
    'Some Code here
    Exit Sub
concatErr:
    If MsgBox("Could not append the receipt for this transaction to the Receipt viewer logs.", vbExclamation + vbRetryCancel, "Warning - Missing Receipt") = vbRetry Then
        err.Clear
        GoTo retryConcat
    End If

错误处理程序包含一个消息框,允许用户在需要时重试。现在这是让我感到困惑的部分。第一次抛出错误时,它会显示消息框并允许用户按预期重试。然后程序跳转到适当的行并再次尝试。但是,第二次抛出错误时,它不会跳转到错误处理程序,而是跳出过程,而父级中的错误处理程序会捕获它!

所以我的问题是为什么它会在后续抛出时跳转到父错误处理程序。这发生在我的代码中的许多地方。在许多我可以手动检查错误的情况下,我可以将代码粘贴在 while 循环中来解决它,但是对于运行时错误,我不得不使用错误捕获,它以这种相当烦人的方式起作用。

任何帮助或建议将不胜感激。

4

1 回答 1

4

你不需要使用Resume retryConcat.

当发生错误时,它会跳转到错误句柄中concatErr:。然后显示消息框,如果用户选择重试,代码将跳转到retryConcat. 正如您使用的那样Goto,它不会退出错误处理程序,因此下次发生错误时,它已经在错误处理程序中并且别无选择,只能将错误向上提升到调用过程。

UsingResume concatRetry允许它退出错误处理程序并在所需的点恢复,这意味着下次发生错误时,它可以再次处理。

如果您想象错误处理程序是一个状态,而不是一段代码,它可能更容易理解。

于 2012-09-26T14:33:45.390 回答