Vb6 如何清理函数中的错误处理?

Vb6 如何清理函数中的错误处理?,vb6,error-handling,Vb6,Error Handling,我正在看别人写的代码 有些大函数是一团糟的,在整个函数中的许多点上都会对错误处理进行更改。在执行函数时,会出现各种各样的错误转到ErrHandler,错误转到0,错误继续下一步 什么是最好的方法来处理和清理这个错误处理,这样在函数的顶部只有一个错误处理程序转到ErrHandler。我不认为只有一个错误处理程序一定是最好的解决方案 如果您有一个带有一个错误处理程序的大型函数,并且出现了一些错误,那么您不知道它在哪一点失败 听起来好像您描述的函数中有正确的错误处理,但这并不意味着它易于阅读 也许最好

我正在看别人写的代码

有些大函数是一团糟的,在整个函数中的许多点上都会对错误处理进行更改。在执行函数时,会出现各种各样的
错误转到ErrHandler
错误转到0
错误继续下一步


什么是最好的方法来处理和清理这个错误处理,这样在函数的顶部只有一个错误处理程序转到ErrHandler。

我不认为只有一个错误处理程序一定是最好的解决方案

如果您有一个带有一个错误处理程序的大型函数,并且出现了一些错误,那么您不知道它在哪一点失败

听起来好像您描述的函数中有正确的错误处理,但这并不意味着它易于阅读

也许最好的解决方案是将大函数分成几个小函数,它们可以有自己的单一错误处理程序,这样当发生错误时,您只有几行代码来跟踪错误


您可以使用现有的错误处理程序语句为代码重分解提供合适的标记。

如果不查看所讨论的代码,很难说,但有时在单个函数中几种不同类型的错误处理是合法的。通常,函数顶部的单个
On Error GoTo ErrHandler
与支持异常的语言中的封闭
try/catch
块具有相同的功能——它用于捕获发生的意外错误

但是,在函数中,可能会有一些地方出现错误,这是您希望内联检查的正常、预期的情况。例如,假设您要访问一个网络驱动器,您必须说明远程服务器处于脱机状态、网络关闭等情况。在这种情况下,即使顶部有一个
On Error GoTo ErrHandler
语句,您也可以使用
On Error Resume Next
在本地关闭该语句,然后尝试访问该驱动器。如果出现错误,VB6现在将进入下一条语句,您可以在该语句中检查除0以外的任何内容。这类似于嵌套的
try/catch
捕获您可以在本地处理的预期错误条件。一旦执行超出了危险代码的范围,就必须用另一个
On Error GoTo ErrHandler
语句标记要“手动”检查错误的部分的末尾,以重新启用函数级处理程序

因此,有一种情况下,不止一个
On Error…
语句是有效的。可以提出这样的论点,即风险函数应该被重构并拥有自己的处理程序,但您仍然必须处理来自该单独函数的特定(预期)错误返回值,因为被调用函数可能不知道在调用函数的上下文中面对这些错误时该怎么办。您仍然可以使用短期的
On Error Resume-Next
技术来处理这个问题


On Error GoTo 0
禁用所有错误处理,使VB6在发生意外错误时退出功能。我很难想出一个非人为的情况,这将是一个很好的选择。

我认为在一个函数中混合使用
错误转到0
错误继续下一步
错误转到ErrHandler
是不正确的。对于重构部分+1。如果一段代码需要自己的错误处理,那么它很可能是一段独立的逻辑。将错误转到0时的
下一次错误恢复时的
和错误转到ErrHandler时的
混合使用可能是正确的(甚至是必要的)。特别是当您在VB6 IDE中执行时,使用CraigJ发布的链接关闭错误处理时。但在一个长函数中,这可能会变得混乱。当任何大型例程变得过于复杂和复杂时,重构成较小的例程是一种很好的方法unwieldy@MarkJ:我不同意在函数中混合使用错误处理是一件好事,除非是在极少数情况下。IDE示例是一种极不寻常的情况,应该隔离为单个函数。我看不出有任何理由不简单地为一个函数使用一个错误处理程序并适当地处理错误。每次我看到错误处理程序被关闭时,我总是能够重写以正确处理错误。@CraigJ我认为我们需要看一些代码,否则讨论太抽象了。除了上一节之外,我完全同意。我更希望
在出错时转到0
而不是在不应该启用时意外地将
在出错时继续下一步
启用。无声地忽略错误会造成更大的伤害。您可以看到的错误是一个您可以修复的错误:)使用
On error GoTo 0
Err.Raise…
之前从方法引发自定义错误。@tcarvin True。当我(过去)编写VB6时,我会在错误恢复时编写下一步的
,然后在错误转到处理程序时编写
,然后返回并填充介于之间的代码以避免该问题。@wqw真有趣。我从未想过要这样做,因为我的标准处理程序将执行Err.Raise,将函数名添加到Err.Description中,以在错误描述中创建一个伪调用堆栈。e、 g.:
Err.Raise Err.Number,“ProcName:”&Err.Description
当应用于嵌套调用时,您会得到一个“function:FunctionB:FunctionC:Divide by 0”的结果作为最终的Err.Description。@JeffK:我也是,但您从调用堆栈中的原始函数中获得了什么信息?您已经知道内部错误的来源。跳过错误处理程序会使方法(和类)在原始项目之外可用(通常错误处理程序是面向项目的)