Vb6 &引用;错误转到“0”时;退出前功能

Vb6 &引用;错误转到“0”时;退出前功能,vb6,error-handling,Vb6,Error Handling,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 {PROCE

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}"

请注意,错误转到0时的
直接放在Exit语句之前。这样做有什么意义?这似乎是多余的。当函数退出时,该函数的错误处理程序仍将关闭。

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

在本例中,过程希望错误处理程序在函数期间处于活动状态,但希望在退出时将其关闭。正如您所说,在这种情况下没有必要这样做,因为错误处理程序的作用域是
{PROCEDURE\u TYPE}
,所以它将在退出时被还原

但有时,程序员(尤其是那些生成模板的程序员)喜欢在技术上不必要的时候自行清理,比如在退出之前释放C程序中分配的内存


这就是我怀疑的情况,它实际上只是一个假设。

这不是关于关闭当前错误处理程序,而是关于清除
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

然后删除注释行。

正如我在问题中所说,当过程退出时,该过程的错误处理程序仍将关闭。在退出函数之前有一个
错误转到0
有什么意义呢?我想说MzTools的作者刚刚搞砸了。确实让你想知道还有什么不对劲。也许没什么致命的,这是一款经过很好测试的产品。它是关于清除Err对象,而不是关闭错误处理程序。请参见wqw的答案。准确地说是+1。根据Exit Sub/Exit功能,还将清除Err对象。简单地通过下降到结束分将不会。默认的MZTools错误处理程序不包括退出子/退出功能。但是明确无误。@MarkJ:向上面的示例中添加
Exit Sub
不会清除
Err
对象
Err.Clear
does:-))Exit Sub(以及其他情况)仅当在错误处理例程本身中执行时才清除错误对象。我有一个类似的问题。因此,从以上的评论和回答中,我推断问题与Err对象有关。那么,共识是什么?使用Exit Sub将不会清除Err对象?这就是我们不应该这样使用它的唯一原因吗?我只在短例程中使用
On Error GoTo 0
抑制错误时使用
On Error Resume Next
(这些是罕见的单行程序,如
SearchCollection
,type casting等)。我还使用了它,就在用
Err.Raise…
引发自定义错误之前,所以这些错误不会被记录在我们的自定义错误处理程序中。