错误处理程序 - Exit Sub 与 End Sub
Posted
技术标签:
【中文标题】错误处理程序 - Exit Sub 与 End Sub【英文标题】:Error Handler - Exit Sub vs. End Sub 【发布时间】:2010-11-25 12:24:43 【问题描述】:为什么我要使用 Exit 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
【问题讨论】:
【参考方案1】:您的 ProcExit 标签是您释放所有资源的地方,无论是否发生错误。例如:
Public Sub SubA()
On Error Goto ProcError
Connection.Open
Open File for Writing
SomePreciousResource.GrabIt
ProcExit:
Connection.Close
Connection = Nothing
Close File
SomePreciousResource.Release
Exit Sub
ProcError:
MsgBox Err.Description
Resume ProcExit
End Sub
【讨论】:
+1。而且,显然,如果您不需要关闭或释放任何资源,则不需要它,您可以直接进入 End Sub。 @MarkJ:这可能没问题,但我会对此感到不舒服,如果错误真的被“处理”了,我宁愿恢复到 ProcExit,即使它紧跟着 Exit Sub。 如果低于ProcExit
的内容引发错误,这不会导致无限循环吗?【参考方案2】:
通常,如果您声明了数据库连接或其他对象,无论是安全使用还是在异常之前创建,都需要清理(处置),然后将错误处理代码返回到 ProcExit 入口点将允许你在这两种情况下都做你的垃圾收集。
如果您通过退出 Sub 而退出您的程序,您可能会冒着在程序内存中积聚大量实例化对象的风险。
【讨论】:
选词不当。 “做你的垃圾收集”和“坐在你的程序内存中”。这可能会鼓励在例程结束时将所有本地对象引用设置为 Nothing。事实上,一旦引用计数变为零,VB6 就会自动对对象和内存进行垃圾回收。如果它们在局部变量中,这发生在 Exit Sub。您只需要在相对少数情况下担心,即需要显式释放特殊资源或需要恢复某些其他状态(例如,将鼠标指针从沙漏变回)。 公平点。我想最好复习一下我的 VB6。反正最近太专注于现代的、面向对象的有趣语言了…… 您仍然可能需要“清理”,尽管不仅仅是通过退出对象引用来删除对象引用。您可能持有对需要显式关闭请求的进程外服务器的引用(例如,Excel 可能正在等待退出调用)。或者您可能希望在退出时释放在过程自身范围之外声明的引用。以上是关于错误处理程序 - Exit Sub 与 End Sub的主要内容,如果未能解决你的问题,请参考以下文章
语法:VB.NET 子程序中的“Exit Sub”或“Return”