gpt4 book ai didi

VBA 错误 "Bubble Up"

转载 作者:行者123 更新时间:2023-12-03 15:20:59 25 4
gpt4 key购买 nike

我没有阅读太多关于它的内容,但是下面链接中的作者建议我不要使用“冒泡”来集中 VBA 中的错误处理。

Excel Programming Weekend Crash Course via Google Books

但我不确定他为什么建议这样做,他也没有真正解释。

有人能告诉我为什么我应该在每个过程中都进行错误处理而不是使用“冒泡”吗?或者至少,你知道作者为什么不这样做吗?

谢谢。

最佳答案

您的第一个问题的简短回答是“您不应该在每个过程中都放置错误处理程序”。但通常一些例程确实需要它们!
说“每个过程都必须有一个错误处理程序”通常是糟糕的建议。 VBA 错误处理的缺陷已在别处进行了很多讨论。但是,从概念上讲,它与其他语言中更标准的异常处理形式并没有什么不同。这些语言的大多数最佳实践都适用。您应该在处理它们有意义的最低级别处理错误。有时这是在发生错误的过程中,很多时候不是。
通常,当发生错误时,内部例程可以做的最有意义的事情就是让它向上传递堆栈,以便它可以到达知道如何处理它的代码。这实际上取决于例程以及它如何与程序的其余部分相适应。
考虑这些例子:
调用过程中的处理程序将处理它调用的例程引发的所有错误。因此,如果一个特定的例程不需要任何清理,那么不要在那里放置任何错误处理程序代码:

Sub Caller()
On Error GoTo HANDLER
ChildProc
On Error GoTo 0

Exit Sub
HANDLER:
Debug.Print Error, "Parent cleanup - something happened in either this procedure or a procedure that it called"
End Sub


Sub ChildProc()
Debug.Print 10 / 0 ' causes error

'Don't bother handling errors here since there's nothing this routine can do about them
End Sub
另一方面,您可能需要清理任务,在这种情况下,您需要一个错误处理程序。
Sub Caller()
On Error GoTo HANDLER
ChildProc
On Error GoTo 0

Exit Sub
HANDLER:
Debug.Print Error, "Parent cleanup"
End Sub


Sub ChildProc()

'Pretend this routine gets ahold of some resource that must be cleaned up when it's done
call get_resources()

On Error GoTo HANDLER
Debug.Print 10 / 0 ' causes error
On Error GoTo 0

'Clean up once we're done
call release_resources()

Exit Sub
HANDLER:
Debug.Print Error, "Child cleanup"

'Clean up in case of an error
call release_resources()

'Raise another error if necessary to let callers know something went wrong
Err.Raise 10000, "ChildProc", Error
End Sub
上面的例子只是为了说明为什么在给定的例程中可能需要或不需要错误处理程序。所以值得注意的是,在实际代码中,“资源”示例通常使用 RAII 技术处理得更好,其中错误处理与资源获取和释放一起封装 - 请参阅 https://stackoverflow.com/a/3792280/58845对于 VBA 示例。并且诸如是否重新引发捕获的错误之类的事情也取决于情况。有时可以完全在本地处理错误,然后无需告诉调用者有任何问题。
您第二个问题的答案是作者似乎不太了解异常处理。他承认错误处理是特定于上下文的,但似乎建议每个过程都应该在“纠正此处的问题并恢复执行”和“终止程序”之间进行本地决定。他遗漏了通常正确的选项,即“在本地清理并将问题踢到楼上”。所以不需要在本地清理的例程应该让错误“冒泡”。

关于VBA 错误 "Bubble Up",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1418777/

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