【问题标题】:"On Error Goto 0" before Exit Function退出函数前的“On Error Goto 0”
【发布时间】:2012-05-01 08:07:44
【问题描述】:

MzTools 中默认的错误处理模板是:

On Error GoTo {PROCEDURE_NAME}_Error

    {PROCEDURE_BODY}

   On Error GoTo 0
   Exit {PROCEDURE_TYPE}

{PROCEDURE_NAME}_Error:

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure {PROCEDURE_NAME} of {MODULE_TYPE} {MODULE_NAME}"

请注意,On Error Goto 0 直接放在 Exit 语句之前。这样做有什么意义?似乎是多余的。当函数退出时,函数的错误处理程序无论如何都会关闭。

【问题讨论】:

    标签: vb6 error-handling


    【解决方案1】:

    on error goto 0 关闭关闭当前范围内的错误处理并恢复到默认情况。

    在这种情况下,过程希望错误处理程序在函数执行期间处于活动状态,但它希望在退出时将其关闭。正如你所说,在这种情况下没有必要,因为错误处理程序的范围是{PROCEDURE_TYPE},所以它会在退出时恢复。

    但有时,编码人员(尤其是那些生成模板的人员)喜欢自行清理,即使技术上没有必要,例如在退出前释放 C 程序中分配的内存。

    这就是我怀疑的情况,它真的只是假设。

    【讨论】:

    • 正如我在问题中所说的,当程序退出时,程序的错误处理程序无论如何都会关闭。在退出函数之前有一个On Error Goto 0 有什么意义?
    • 我想说 MzTools 的作者搞砸了。是否让你想知道那里还有什么问题。不过可能没什么致命的,它是一个经过良好测试的产品。
    • 没有。它是关于清除 Err 对象,而不是关闭错误处理程序。见 wqw 的回答。
    【解决方案2】:

    这不是关闭当前的错误处理程序,而是清除 Err 对象。

    试试这个

    Option Explicit
    
    Private Sub Command1_Click()
        pvTest
        MsgBox Err.Description
    End Sub
    
    Private Sub pvTest()
        On Error Resume Next
        Debug.Print 1 / 0
    '    On Error GoTo 0
    End Sub
    

    然后删除注释行。

    【讨论】:

    • +1 没错。根据docsExit Sub/Exit Function 也会清除Err 对象。简单地落入 End Sub 不会。默认的 MZTools 错误处理程序确实包括 Exit Sub / Exit Function。但露骨也无妨。
    • @MarkJ:在上面的示例中添加Exit Sub 不会清除Err 对象。 Err.Clear 确实:-))
    • Exit Sub(和其他情况)只有在错误处理例程本身完成时才清除错误对象。
    • 我有一个类似的问题stackoverflow.com/questions/10510158/…。因此,从上述 cmets 和答案中,我得出问题与 Err 对象有关。那么共识是什么呢?使用 Exit Sub 不会清除 Err 对象吗?这是我们不应该那样使用它的唯一原因吗?
    • 我只在使用 On Error Resume Next 抑制错误时才使用 On Error GoTo 0 在简短的例程中(这些是罕见的单行代码,如 SearchCollection、类型转换等)。我也在使用Err.Raise ... 引发自定义错误之前使用它,因此这些错误不会被记录到我们的自定义错误处理程序中。
    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多