我在我的主调用过程中使用了一个错误处理程序,并让其他过程只是汇总到该错误处理程序。
我每次都应该清除错误吗?或者我应该退出Sub而不是让错误处理程序继续在End Sub?
我问,因为我读过我可能会收到第一个错误,然后其他错误将无法处理。
很抱歉,如果这不是很清楚的话。不太确定我在说什么。
谢谢!
编辑:这样的事情。这有必要吗?
Public Sub SubA()
On Error Goto ProcError
' other code
MsgBox FuncA()
ProcExit:
Exit Sub
ProcError:
MsgBox Err.Description
Resume ProcExit
End Sub
答案 0 :(得分:2)
OP:我每次都应该清除错误吗?或者我应该退出Sub而不是让错误处理程序继续在End Sub?
清除错误是什么意思?
通常,程序以这种方式编写
public sub myProcedure()
on error goto e:
'statements that could raise error
exit sub
e:
Log err.Number, err.Description, "error occurred in myProcedure"
end sub
OR
您可以选择不添加错误处理程序。在这种情况下,错误将传播给调用者(或处理它的过程)。
请发布您想要实现的示例代码&你的期望。
编辑:以下是您发布的代码的含义
Public Sub SubA()
On Error Goto ProcError
' other code
MsgBox FuncA()
exit sub 'put exit sub otherwise it will execute the line below, even if no error
ProcExit:
'this statement will get executed after the error msgbox is shown
msgbox "Reached ProcExit"
Exit Sub
ProcError:
MsgBox Err.Description 'catch the error and show the msgbox
'error is cleared the point it reaches ProcError
'Resume ProcExit acts as goto, to execute any statements after the error is handled
Resume ProcExit
End Sub
答案 1 :(得分:1)
使用您的特定示例,您不需要清除错误,因为您的模式基于捕获错误。虽然没有伤害:
ProcExit:
Exit Sub
ProcError:
MsgBox Err.Description
Err.Clear
Resume ProcExit
现在,如果你有一个模式,你检查错误而不是捕获它们,那么是的,你必须清除它。这是一个小例子:
On Error Resume Next
Dim o as Object
Set o = myCollection(someKey)
if Err.Number <> 0 then
... respond to error
Err.Clear
我希望这会有所帮助。
答案 2 :(得分:1)
每当您按预期退出Sub时,Err对象都会被清除(例如,不会发生错误)。在您的示例中,Resume ProcExit
语句是不必要的。以下两个子行为的行为方式相同:
Public Sub SubA()
On Error Goto ProcError
MsgBox FuncA()
ProcExit:
Exit Sub
ProcError:
MsgBox Err.Description
Resume ProcExit
End Sub
Public Sub SubA()
On Error Goto ProcError
MsgBox FuncA()
Exit Sub
ProcError:
MsgBox Err.Description
End Sub
您不必使用Exit Sub
语句来清除Err对象。当你点击End Sub
时,只是从子上掉下来就会产生同样的影响。
如果您希望“其他过程”中的错误“汇总”(更好的词是传播)到主调用过程的错误处理程序,它们根本不应包含错误处理程序。例如,假设Main调用SubA,SubA调用FuncA。 FuncA中发生错误。如果您通过简单地显示一个消息框来处理FuncA中的错误,就像您在示例中所做的那样,代码将继续在SubA中执行,但是由于FuncA中出现问题并且SubA不知道,因此将处于不稳定状态它
一种选择是避免在SubA和FuncA中放置错误处理程序。当FuncA中发生错误时,它会被提升到SubA,然后SubA将其提升到Main,然后正确处理它。
更好的选择是捕获错误,记录错误,然后重新提升它们。然后当错误最终通过错误处理程序进入您的Main Sub时,您将获得更多信息。