Public Sub MyTest()
   On Error GoTo MyTest_Error
   On Error GoTo 0 '这一句放在这里是什么意思?
   Exit SubMyTest_Error:    MsgBox "Error " & Err.Number & " (" & Err.Description & _
        ") in procedure MyTest of User Control ShapeLabel"
End Sub
上面是MZ-Tools自动生成的错误处理代码,请问On Error GoTo 0放在Exit Sub之前是有什么意思么?Exit Sub不就自动终止错误处理了么?又或者是允许在On Error GoTo 0和Exit Sub之间加一些代码?那为何要终止错误捕捉?总之吧,在这里安排一句停止错误捕捉是什么意思啊?

解决方案 »

  1.   

    On Error GoTo 0 停止在当前过程中处理错误。即使过程中包含编号为 0 的行,它也不把行 0 指定为处理错误的代码的起点。如果没有 On Error GoTo 0 语句,在退出过程时,错误处理程序会自动关闭。
    在错误未发生的时候,为了防止错误处理程序代码运行,请像在下段程序中那样,在紧靠着错误处理程序的前面写入 Exit Sub、Exit Function 或 Exit Property 语句。
    Sub InitializeMatrix(Var1, Var2, Var3, Var4)
       On Error GoTo ErrorHandler
       . . .
       Exit Sub
    ErrorHandler:
       . . .
       Resume Next
    End Sub
    此处,错误处理程序代码在 Exit Sub 语句之后,而在 End Sub 语句之前,从而与过程中的流程分开。错误处理程序代码可以在程序中的任何地方写入。

    从以上MSDN中的说明来看:
    Public Sub MyTest()
       On Error GoTo MyTest_Error
       ...
       On Error GoTo 0 '这一句写不写两可
       Exit SubMyTest_Error:
        MsgBox "Error " & Err.Number & " (" & Err.Description & _
            ") in procedure MyTest of User Control ShapeLabel"
    End Sub
    ---------------------------------------------------------------
    Public Sub MyTest()
       On Error GoTo MyTest_Error
       ...
       On Error GoTo 0 '如果有错误发生,肯定在这句以上的语句,便于调试
       ...
       Exit SubMyTest_Error:
        MsgBox "Error " & Err.Number & " (" & Err.Description & _
            ") in procedure MyTest of User Control ShapeLabel"
    End Sub
      

  2.   

    On Error GoTo MyTest_Error
    ''仅仅捕捉这两句之间的语句导致的错误。
    ''比如磁盘未就绪、文件路径不存在之类的错误
    On Error GoTo 0 
    ''这以下的语句不管了
    ''这以下可能都是在内存做一些简单处理,不操作外部设备,不会出错,就不捕捉了
      

  3.   

    On Error GoTo 0
    表示以后发生的错误当前过程不捕获,必须由调用者进行处理。
    通常是通过 Err.Raise 方式向调用者抛出错误。
      

  4.   


    Public Sub MyTest()
       On Error GoTo MyTest_Error
       On Error GoTo 0 '这一句放在这里是什么意思?
        Err.Raise 555 '有什么必要特地在这里抛出去呢?
       Exit SubMyTest_Error:
        Err.Raise 555 '如果Err.Raise放在这里本来就是抛到调用堆栈的上一层去了吧?
        MsgBox "Error " & Err.Number & " (" & Err.Description & _
            ") in procedure MyTest of User Control ShapeLabel"
    End Sub
    如果Err.Raise放在本身的错误处理程序的话,本来就是抛到调用堆栈的上一层去了;有什么必要把抛出异常安排在 On Error GoTo 0和Exit Sub之间呢?
      

  5.   

    本身没有发生错误,但是你用 If 语句判断出某种逻辑上不允许的情况,就需要直接 Err.Raise 给调用者。