Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA错误“;“泡泡起来”;_Vba_Excel - Fatal编程技术网

VBA错误“;“泡泡起来”;

VBA错误“;“泡泡起来”;,vba,excel,Vba,Excel,我没有读过太多关于它的文章,但是下面链接的作者建议我不要使用“bubble up”来集中VBA中的错误处理 但我不知道他为什么建议这样做,他也没有真正解释 有人能告诉我为什么我应该把错误处理放在每一个过程中,而不是使用“冒泡”吗?或者至少,你知道作者为什么说不 谢谢。我在他的解释中至少看到了一个原因:因为这样做剥夺了你从简历中获得的利益(下一步)。 另外,您不知道错误发生在哪个模块中 最好不要在错误处理中使用“冒泡”部分,因为应该处理错误&如果知道该做什么,那么如果发生这样的错误,过程比调用过

我没有读过太多关于它的文章,但是下面链接的作者建议我不要使用“bubble up”来集中VBA中的错误处理

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

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


谢谢。

我在他的解释中至少看到了一个原因:因为这样做剥夺了你从简历中获得的利益(下一步)。
另外,您不知道错误发生在哪个模块中

最好不要在错误处理中使用“冒泡”部分,因为应该处理错误&如果知道该做什么,那么如果发生这样的错误,过程比调用过程更清楚该做什么

Sub test()
  On Error GoTo e
  Dim c As Integer
  Dim d As Integer
  c = add(5, 0)
  d = divideWhichManagedItsOwnErrorHandling(5, 0)
  d = divide(5, 0)

  Exit Sub

e:
  MsgBox "error occurred somewhere for which I don't know what to do: " + Err.Description
End Sub

Function add(a As Integer, b As Integer) As Integer
   add = a + b
End Function

Function divide(a As Integer, b As Integer) As Integer
   divide = a / b 'if error occurs, it will "bubble-up" to the caller.
End Function

Function divideWhichManagedItsOwnErrorHandling(a As Integer, b As Integer) As Integer
  On Error Resume Next
  Dim result As Integer
  result = a / b
  If Err.Number = 11 Then 'if divide by zero occurred, user must have passed 0 for b
    result = 0 ' return 0 if the divide by zero occurs. 
  End If
  divideWhichManagedItsOwnErrorHandling = result
End Function

我不确定VBA的默认错误处理是什么,但是由于它的Visual Basic for Applications,并且这些应用程序包括excel和word之类的内容,我假设只会出现一个对话框,这对用户没有帮助

我假设作者已经被不处理错误的代码所折磨,所以他现在推荐所有处理错误的过程


完整的答案是,您必须了解可能发生的每一个错误,并准备好代码来处理它,无论是尽可能低的错误(您可能不知道该做什么),还是尽可能高的错误(这意味着编写错误处理代码的工作量减少,但不知道错误发生的原因),还是策略性的错误(在正确的地方,您应该能够从最常见的错误中恢复)或者在任何地方(这可能是太多的开发工作)。

第一个问题的简短回答是“您不应该在每个过程中都放置错误处理程序”

说“每个过程都必须有一个错误处理程序”总的来说,这是一个糟糕的建议。VBA错误处理的缺陷在其他地方已经讨论过很多。但是,从概念上讲,它与其他语言中更标准的异常处理形式并没有什么不同。这些语言中的大多数最佳实践都适用。您应该在处理错误的最低级别上处理错误有时这是发生错误的过程,很多时候不是

例如,从工作表中调用的VBA UDF肯定应该有一个EH,确保您向调用单元格返回Excel错误值而不是将用户带着错误消息放入代码编辑器。但是,您从该UDF调用的代码可能需要也可能不需要任何代码。事实上,当错误发生时,内部例程通常可以做的最有意义的事情就是让它向上传递堆栈,以便它可以到达知道如何处理它的代码。这实际上取决于ro乌丁

第二个问题的答案是,作者似乎不太了解异常处理。他承认错误处理是特定于上下文的,但似乎建议每个过程都应该在“立即纠正问题并恢复执行”和“终止程序”之间进行局部决定。他省略了通常正确的选项,即“在本地清理并将问题踢到楼上”。因此,不需要在本地清理的例程应该让错误“冒出来”。

我的2美分: 您应该在所有公共过程和事件上放置错误处理程序。这意味着位于调用堆栈底部的过程将始终具有错误处理程序。然后在其他过程中添加有意义的错误处理程序。如果在没有错误处理程序的过程中发生错误,它将“冒泡”以专业方式记录/显示顶级错误处理程序。 您可能希望将错误处理程序添加到私有(较低级别)过程的场景如下: 代码需要快速。您有一种罕见的情况可以避免,但会迫使您在循环(或更糟的是嵌套循环)内部执行昂贵的逻辑测试。 您可以在错误处理程序中执行逻辑测试,如果说“罕见事件”,则进行更正并继续。由于情况罕见,您将看到大多数情况下的性能提高。如果错误处理程序无法找出并更正问题,则重新引发错误,使其在堆栈上冒泡


显然,这只是一种情况。

a/0不是0!您刚刚吞下了一个真正的错误并返回了一个错误的结果。@jtolle:我不是在这里讨论除法的结果。这只是给出一个错误处理的示例&具体地说,就是在发生错误的地方处理错误。您需要一个更好的示例。这个特定的错误不应该被处理这样,-1请不要使用缩短的URL。没有人喜欢在工作中使用盲链接。(+1可在直接链接中使用。)有关非VBA示例,请参阅:任何涉及“上楼”的参考资料请?@QHarr,看看这个答案和…VBA中包含的链接,确实允许出现错误。也有例外,但一般来说,你不必在每个方法中都进行错误处理,以防止应用程序出现不一致的弹出。