【问题标题】:Trap error or 'Resume Next'陷阱错误或“继续下一步”
【发布时间】:2012-04-10 02:59:17
【问题描述】:

我意识到这是一个较旧的编程环境,但我必须清理一些 VB6 代码,我发现它大部分都在使用:

On Error Resume Next

关于使用On Error Resume Next的普遍共识是什么?

当然,如果出现错误,您会希望应用停止它正在执行的操作,回滚任何数据更改,并将错误通知用户,而不仅仅是恢复。

什么时候使用On Error Resume Next比较好?

【问题讨论】:

  • 重新阅读您的问题:“我发现它大部分都在使用......”是一个不好的迹象。没有充分的理由滥用 On Error Resume Next。
  • 问:什么时候使用 On Error Resume Next 比较好?答:当您是 vb6 极客时。

标签: vb6 error-handling


【解决方案1】:

使用On Error Resume Next 来实现本地结构化错误处理是完全合理的。这当然包括测试异常并对其采取行动,以及随后解除机制。示例:

On Error Resume Next
GetAttr strFilePath
If Err Then
    On Error GoTo 0
    'Deal with "no file" scenario.
Else
    On Error GoTo 0
    'Open and process the file.
End If

这只是一个简单的示例,其中只需要一种异常。在某些情况下,有必要测试 Err.Number 的特定值并根据它们采取不同的操作。

基于 GoTo label 的非结构化方法通常也可以工作,但在大多数情况下它几乎没有优势。在 VBScript 中,上面显示的模式是唯一的异常处理形式,因为没有 GoTo 或标签。

令人反感的是,在每个程序的开头都进行显式异常测试并忽略它...一种 Trust the Force,Luke 试图掩盖编码错误的方法。

【讨论】:

  • +1 disarming the mechanism afterwardon error goto 0 恢复它:这就是它的工作原理!恕我直言,检查特定错误号非常类似于在 try...catch 块中捕获特定异常:在有保证的情况下完全可以接受。
  • 其实我更喜欢用resume next来关闭错误处理,运行failure-okay语句,清除预期的错误并用goto errHandler恢复错误处理,其中errHandler是一个标签带有if err then 块的过程底部,以便此代码不会在正常执行路径上运行。
  • 我想,只要您的“错误处理程序”实际上可以采取一些有用的操作(只是自己调用 MsgBox 不会增加太多价值)并且就此而言,您可能希望任何进一步的异常冒泡由来电者困在那里。
【解决方案2】:

我发现它在错误不会保证用户被问题打断的功能中很有用。一个很好的例子是在 resize 事件中。如果您犯了错误或在调整大小事件中出现问题,那么您可能不希望用户看到这一点,因为它可能不会影响功能。

我会说一般来说,谨慎使用它。

【讨论】:

  • +1。谨慎使用它并尽可能缩短范围。这是一个很好的故事,讲述了On Error Resume Next 如何将一个小错字变成一个只出现在客户机器上并且很难调试的邪恶错误developerfusion.com/code/4325/…
  • +1:Resize 方法通常是 On Error Resume Next 的正确用例,如此处所述。对于无法避免引发错误但希望以不同方式处理它的情况,例如当您尝试访问 Collection 中不存在的项目时,它也很有用。由于Collection 类上没有Exists 方法,因此尝试访问集合中的项目并捕获任何由此产生的错误是确定该项目是否存在的唯一方法。
  • 注意,On Error Resume Next 在您不想在代码中跳转到一堆不同的错误处理标签时往往最有用,以防您可能需要处理代码中不同点的许多不同错误。 On Error Resume Next 允许您使用普通代码“按顺序”编写错误处理逻辑。 On Error Resume Next...尝试做一些可能出错的事情...检查Err.Number 以查看是否发生错误并适当处理...重复。
  • 我已将 IDE 设置为中断所有错误,因此即使您使用 On Error Resume Next,它仍然会在您在 IDE 中调试时停止,您将能够修复根本原因。 (仅供参考)
  • @Scott:虽然我同意这是正确的行为,但我希望他们为“打破所有错误,除非我特别放在 On Error Resume Next 的地方,因为我不想得到调试时弹出一百万个错误”。
【解决方案3】:

几乎从不 - 除非有意识地使用,例如在成功调用将设置特定返回值的行上,并且后续代码处理返回值以适应错误情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    相关资源
    最近更新 更多