错误处理程序 - 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的主要内容,如果未能解决你的问题,请参考以下文章

End Sub 上需要错误 424 对象

语法:VB.NET 子程序中的“Exit Sub”或“Return”

python find

python 处理异常 sys.exit出现错误,这是怎么回事?

处理严重错误的方式是不友好的 exit() 吗?

ICE 默认 IO 错误处理程序执行 exit(), pid = 11281, errno = 4