Vb6 对运行时错误重试

Vb6 对运行时错误重试,vb6,error-handling,Vb6,Error Handling,这个问题我已经遇到过好几次了,但一直没能解决,但现在我需要一劳永逸地解决它 我有一个抛出运行时错误的过程。这不是问题,因为我在函数顶部定义了一个错误处理程序,在函数底部定义了一个类似这样的处理程序: retryConcat: On Local Error GoTo concatErr 'Some Code here Exit Sub concatErr: If MsgBox("Could not append the receipt for this transactio

这个问题我已经遇到过好几次了,但一直没能解决,但现在我需要一劳永逸地解决它

我有一个抛出运行时错误的过程。这不是问题,因为我在函数顶部定义了一个错误处理程序,在函数底部定义了一个类似这样的处理程序:

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循环来解决它,但是对于运行时错误,我不得不使用错误捕获,这种方式相当烦人


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

您不需要使用
Resume retryConcat

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

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


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

您不需要使用
Resume retryConcat

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

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


如果您认为错误处理程序是一个状态,而不是代码的一部分,那么它可能会更容易理解。

感谢这一点,它已经困扰了我大约5年了。那么,启动处理程序是否真的从正在持久化的同一个父级创建了一个新的堆栈框架呢?我不知道内部结构。抱歉:(非常感谢这一点,它已经困扰了我大约5年了。那么,启动处理程序是否真的会从正在持久化的同一个父级创建一个新的堆栈框架?我不知道内部结构。抱歉:(