我在某处读到了不建议退出错误处理块的地方。可悲的是,他们没有给出解释原因?
我很好奇为什么会这样。我在"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
答案 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