有些问题需要了解从sub。
调用/ run sub或function时的错误处理方式。如果在被叫子中没有错误处理,源子句的错误处理是否适用?
如果被叫子中的错误处理有"退出子"或"退出功能"源子继续运行吗?
ASD ASD
Sub Testing()
On Error GoTo ErrorHandling
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Call TestMinorSub
ExitHandling:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Exit Sub
ErrorHandling:
MsgBox Err.Description
Resume ExitHandling
End Sub
答案 0 :(得分:3)
非结构化异常处理 - 正如Microsoft定义的那样(与结构化异常处理相对)并不是最好的事情,并且可能会非常复杂。
所以在这个例子中,如果从某个调用站点调用sub ...
<强> 1。没有错误 在调用TestMinorSub后,sub继续运行,直到它通过exit sub退出。
<强> 2。 TestMinorSub中存在错误,并且TestMinorSub具有错误处理程序。 这将根据其在此函数中的定义来处理错误。这个 函数可以吞下错误或使用Err.Raise将其提升回Testing sub。
第3。 TestMinorSub中存在错误,TestMinorSub没有错误处理程序。 这将遍历处理程序的调用堆栈并跳回到将处理它的Testing函数。它将跳转到ErrorHandling标签(这是此函数的偶数处理程序),它通过消息框显示错误。然后它继续到标签ExitHandling,它将在退出函数之前执行剩余的代码。
这种类型的代码路径对于VBA来说非常常见,并且可能比您的示例复杂得多。基本上,开发人员试图捕获错误,并在错误执行一些清理代码之后,在例程结束之前。
答案 1 :(得分:2)
要回答第一个问题,请查看以下代码段。 AnotherSub
中没有错误处理,因此SourceSub
的错误处理开始了:
Sub SourceSub()
On Error GoTo Err:
Call AnotherSub
MsgBox "Source completed"
Exit Sub
Err:
MsgBox "An error occurred in source"
End Sub
Sub AnotherSub()
'On Error GoTo Err:
MsgBox Application.WorksheetFunction.Match("1", "abcd", 0)
Exit Sub
Err:
MsgBox "An error occurred in ANotherSub"
End Sub
因此,SourceSub
无法完成,因为您可以看到行MsgBox "Source completed"
未执行。
要回答您的第二个问题,如果您取消注释AnotherSub
(On Error Goto Err:
)AnotherSub
的错误处理将处理错误,那么SourceSub
将运行到完成显示源已完成的消息框指示完成。
这意味着,只要您在相关程序中处理错误,Exit Function
或Exit Sub
就无法发挥作用。
答案 2 :(得分:1)
这里开始错误处理。
On Error GoTo ErrorHandling
如果错误则转到ErrorHandling
如果没有错误,则下一个代码将运行。
如果没有错误,sub将在“Exit Sub”之前退出
ExitHandling:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Exit Sub
如果出现错误,代码就会到达这个地方并运行这些行并转到“ExitHandling”:
ErrorHandling中:
MsgBox Err.Description
恢复ExitHandling
End Sub