为什么你会使用"On Error Goto 0"?

CJ7*_*CJ7 27 vb6 error-handling

为什么你会"On Error Goto 0"在VB6应用程序中使用?

此语句将关闭错误处理程序,并且意味着任何错误都会导致应用程序崩溃.为什么这会是可取的?

Mat*_*ard 48

在VB6中,您可以指定您希望稍后在例程中由特定代码处理错误:

Sub Bar()
    On Error Goto MyHandler
    ...
    ...some code that throws an error...
    ...
    Exit Sub
MyHandler:
    ...some error handler code (maybe pops up a dialog)
End Sub
Run Code Online (Sandbox Code Playgroud)

这可能是这种情况,但是,抛出的错误代码是局部的,而你不希望所有的程序代码的其余部分是相同的处理.在这种情况下,您将使用"On Error Goto 0",如下所示:

Sub Bar()
    ...
    On Error Goto MyHandler
    ...some code that throws an error...
    On Error Goto 0
    ...
    ...
    Exit Sub
MyHandler:
    ...some error handler code (maybe pops up a dialog)
End Sub
Run Code Online (Sandbox Code Playgroud)

现在,只有在特定代码行失败时,您才能有效地确定错误处理的范围.

通过调用"On Error Goto 0",您并不是说您希望应用程序立即崩溃.您只是说要取消注册您在例程中先前设置的任何错误处理程序; 错误将在调用堆栈中传递给调用例程,就像正常情况一样.

  • Craig,这与首先没有设置错误处理程序没有区别.默认情况下,没有任何错误处理,应用程序将崩溃.即使在最高级别,通常有必要明确哪些代码行具有"活动"错误处理,然后再将其关闭.假设我们只想在某些代码失败的情况下进行日志记录.之后我们应该取消注册错误处理程序.错误处理并不总是防止崩溃; 它可以用于记录或清理系统资源.崩溃可能是期望的(有意识的)行为. (5认同)
  • 您还将错误处理堆栈传递给调用过程 (2认同)

Bob*_*b77 8

由于用文字描述似乎很笨拙,这里有一些例子说明你可以On Error GoTo 0用于本地化的结构化错误处理.

第一个是Property Get类("MicroDOM"),它基于子类集合的层次结构实现轻量级DOM.在这种情况下,我们希望尝试通过名称而不是索引来引用缺少的Child来创建一个空的(没有attrbutes或子)Child:

Public Property Get Child(ByVal Key As Variant) As MicroDOM
    If mChildren Is Nothing Then
        Set mChildren = New Collection
    End If
    On Error Resume Next
    Set Child = mChildren(Key)
    If Err Then
        On Error GoTo 0
        If VarType(Key) = vbString Then
            Key = Trim$(Key)
            Set Child = New MicroDOM
            Child.Key = Key
            mChildren.Add Child, Key
        Else
            Err.Raise 9 'Subscript error as thrown by the Collection.
        End If
    End If
End Property
Run Code Online (Sandbox Code Playgroud)

第二个是内联代码,删除文件(如果存在):

On Error Resume Next
Kill strFilePath
On Error GoTo 0
Run Code Online (Sandbox Code Playgroud)

第三个是内联代码,仅在文件恰好存在时才执行操作:

On Error Resume Next
GetAttr strFilePath
If Err Then
    On Error GoTo 0
    ProcessTheData strFilePath
End If
On Error GoTo 0
Run Code Online (Sandbox Code Playgroud)

虽然对于没有经验的人(On Error GoTo 0在两个地方执行)来说可能看起来很尴尬,但结果却比On Error GoTo Label那些来回跳筏来处理各种异常更不笨拙和更有条理.

奖励是你也可以获得VBScript的可移植性,因为On Error GoTo Label它根本不是一个有效的构造.


DJ.*_*DJ. 5

它仅关闭CURRENT过程中的错误处理.如果调用过程中有错误处理程序,它将捕获任何未处理的异常.VB继续向上调用堆栈,直到找到错误处理程序.如果它没有找到任何那么它将导致运行时错误.

所以举个例子 - 也许你有一个包装器函数可以调用一些可能引发异常的第三方实用程序.而不是处理包装函数中的异常,而是放在On Error Goto 0那里.那么包装器函数的调用者将获得传递给它的异常,并希望以适当的方式处理它.