我在VBA(Excel)中编写了一些带有错误处理标签的代码。它工作正常,直到我最近注意到错误处理代码每次都被执行,而不仅仅是在发生错误时。有人知道为什么会这样吗?感谢。
这是一个简单的测试案例,其中会弹出两个 msgbox。
Sub example()
On Error GoTo err_handle
MsgBox "OK!"
err_handle:
MsgBox "not OK"
End Sub
答案 0 :(得分:12)
您想在例程中添加一个Exit Sub:
Sub example()
On Error GoTo err_handle
MsgBox "OK!"
Exit Sub
err_handle:
MsgBox "not OK"
End Sub
Look here进行全面解释。
答案 1 :(得分:1)
这是因为你没有在第一个消息框(OK)之后返回子程序。在显示之后,执行下一行代码,这是“不正常”的消息。
您可以在错误处理程序标签(ExitSub)之前提前退出子例程,或者在成功时转到子例程的结尾(绕过“错误”例程)
答案 2 :(得分:1)
需要添加exit sub
否则程序继续执行标签,因为它是代码的一部分
答案 3 :(得分:0)
正如澄清一样,为其他答案添加一些肉。
“err_handle:”只是错误处理代码,因为您正在使用它。它本质上不是一个错误处理程序,就像其他语言中的catch块一样。
技术上“err_handle:”只是一个促进goto跳跃的标签。在你的情况下,goto恰好与错误处理程序一起使用(在错误转到)
答案 4 :(得分:0)
错误处理的普遍接受的模式是具有错误处理程序和退出过程。一个非常标准的代码树桩可能如下所示:
Public Function Example() As String
Dim strRtnVal As String 'Return value variable.
On Error GoTo Err_Hnd
'***************************************************************************
'Lock interface code here (hourglass, screenupdating etc.)
'***************************************************************************
'***************************************************************************
'Your code here.
'***************************************************************************
Exit_Proc:
'Prevents "Error Loops" caused by errors within the exit procedure:
On Error Resume Next
'***************************************************************************
'Restore Interface.
'***************************************************************************
Example = strRtnVal 'Set Return Value.
Exit Function
Err_Hnd:
'Display message, do some logging, whatever.
Resume Exit_Proc '<- Run exit procedure.
End Function