为什么从错误处理程序块内部退出sub是错误的?

时间:2012-05-09 05:10:46

标签: vb6 error-handling

我在某处读到了不建议退出错误处理块的地方。可悲的是,他们没有给出解释原因?

我很好奇为什么会这样。我在"On Error Goto 0" before Exit Function的讨论中找到了与此相关的内容,但不确定这是否是确定的答案。他们谈论Err对象没有被清除。这是唯一的问题吗?如果有的话还有解决方法吗?

这是错的吗?如果是,那么退出该功能的推荐方法是什么?我不是支持陈述的巨大支持者,他们使代码更难以遵循。

    Private Sub Foo2()
        On Error Resume Next
            'Multiple lines of code

            If Not Foo(arg1,arg2) Then
                Exit Sub  'Can I exit here?
            End If

            'Multiple lines of code
        On Error GoTo 0
    End Sub

4 个答案:

答案 0 :(得分:1)

如果我理解你的问题,最好的方法是做一些事情:

Private Sub Foo2()
    On Error Goto ErrHandler
        'Multiple lines of code

        If Not Foo(arg1,arg2) Then
            Exit Sub  'Can I exit here?
        End If

        Multiple lines of code

ErrHandler:
    Error handling mechanism here.
End Sub

答案 1 :(得分:1)

除了关于On Error Resume Next的警告(注意它们!!)之外,这段代码没有任何问题。错误处理语句的范围是Foo2 Sub,它将在您退出时过期。当你在For块中调用另一个Sub时会出现危险,它本身可以调用其他Subs。 那些潜艇将继承On Error Resume Next,并且当吞下从它们引发的错误时,它会给你多年的噩梦......

答案 2 :(得分:0)

在我过去使用VB6的经历中,使用Resume Next并不是一个好主意。我从来没用过它。我的代码尽力避免错误,并且在发生错误的情况下,它总是会转到错误处理程序块。您链接的问题说明了MZTools的使用,我大量使用它。

所以,我的观点是Resume Next代码很可能只是一个练习,而不是真正的生产代码。如果这是真的,那么你不必在Exit Sub之前清除Err对象,因为Err对象无论如何都不会有任何东西。如果您遇到DID错误,它将转到ErrorHandler标签并从那里继续。我是那个处理程序,是的,理想情况下你想要对Err对象做一些事情,然后适当地返回给调用者。

答案 3 :(得分:0)

我会重新安排你的代码行,并确保exit子句或退出函数总是在ErrorHandler之前:

Private Sub Foo2()
   On Error Goto ErrHandler

    'Multiple lines of code

    If Foo(arg1,arg2) Then

        'Multiple lines of code

    End If

    Exit Sub

  ErrHandler:
    Error handling mechanism here.
End Sub