2012-05-09 24 views
0

我从某个地方读取,不建议从错误处理块退出。可悲的是,他们没有给出解释,为什么?为什么从一个错误处理程序块中退出一个子程序是错误的?

我很好奇为什么这样。我在"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 
+3

'On Error Goto'绝对没问题,如果使用纪律。它相当于更现代语言中的“Try ... Catch”块。肯定比'On Error Resume Next'更好' – MarkJ

+3

'On Error Resume Next'是纯粹的邪恶,当应用于多行代码时可能会引发您无法预防的异常。 – Dabblernl

回答

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 
+0

没有我的问题是关于if语句中的Exit Sub。从错误块中退出一个子可以吗? – MAC

+0

关于错误恢复下一个是一个棘手的恶魔,它所做的是允许执行下一行代码,即使发生了错误,因此在大多数情况下,它会有意想不到的结果。就像在我的帖子上一样,最好使用错误处理机制,而不是在错误恢复中使用,除非您100%确定在错误发生后恢复不会对代码的时序逻辑产生影响。 –

+0

@MAC肯定可以退出错误块内的子块,VB6中的错误语句只是一个标签,用于告诉系统在发生错误时的位置,但没有其他错误发生,所以如果您在错误块内退出它 – Nick

0

在我与VB6以往的经验,使用继续下一步是不是一个好主意。我从来没有用过它。我的代码尽其所能避免错误,并且在发生错误的情况下,它总是会返回到错误处理程序块。您链接的问题说明了我使用MZTools的情况,我非常自由地使用它。

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

1

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

0

我将重新排列你的代码行并确保exit sub或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 
相关问题