【问题标题】:Error Handler - Exit Sub vs. End Sub错误处理程序 - Exit Sub 与 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

【问题讨论】:

    标签: vba vb6 error-handling


    【解决方案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 可能正在等待退出调用)。或者您可能希望在退出时释放在过程自身范围之外声明的引用。
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2020-06-17
    • 2023-04-04
    相关资源
    最近更新 更多