为什么从一个错误处理程序块中退出一个子程序是错误的?
我从某个地方读取,不建议从错误处理块退出。可悲的是,他们没有给出解释,为什么?为什么从一个错误处理程序块中退出一个子程序是错误的?
我很好奇为什么这样。我在"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
如果我正确理解你的问题,更好的办法是就是像做:
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
在我与VB6以往的经验,使用继续下一步是不是一个好主意。我从来没有用过它。我的代码尽其所能避免错误,并且在发生错误的情况下,它总是会返回到错误处理程序块。您链接的问题说明了我使用MZTools的情况,我非常自由地使用它。
所以,我的观点是Resume Next代码很可能只是一个练习,但不是真正的生产代码。如果这是真的,那么你不必在Exit Sub之前清除Err对象,因为Err对象无论如何都不会有任何东西。如果您遇到错误,它会转到ErrorHandler标签,并从那里继续。我是那个处理程序,是的,你最好想用Err对象做一些事情,然后适当地返回给调用者。
除了关于On Error Resume Next
(听他们!!)的警告之外,这段代码没有问题。错误处理语句的范围是Foo2 Sub,它将在您退出时到期。当您在For块中调用另一个Sub时,会出现这种危险,它本身可能会调用其他Subs。 那些潜艇将继承On Error Resume Next并且会给你多年来的恶梦,当他们引发的错误被吞噬时...
我将重新排列你的代码行并确保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
'On Error Goto'绝对没问题,如果使用纪律。它相当于更现代语言中的“Try ... Catch”块。肯定比'On Error Resume Next'更好' – MarkJ
'On Error Resume Next'是纯粹的邪恶,当应用于多行代码时可能会引发您无法预防的异常。 – Dabblernl