【问题标题】:VB6 error propagationVB6 错误传播
【发布时间】:2010-11-25 12:08:44
【问题描述】:

我在我的主调用过程中使用了一个错误处理程序,并让其他程序直接汇总到该错误处理程序。

我应该每次都清除错误吗?还是应该退出 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

【问题讨论】:

  • 请发布您自己的代码(或至少其中一些)来演示该问题。
  • 根据示例代码,您在哪里清除错误?
  • 好吧,我读到“Resume ProcExit”与 Err.Clear 做同样的事情。但是为什么我发布的代码是这样的?为什么“恢复 ProcExit”?只是为了清除错误?这样同样的程序可以处理下一个潜在的错误?
  • 当您写“on error goto procError”时,如果发生错误,控件会跳转到“procError:”之后的行。因此错误得到处理,您可以在范围内使用 Err 对象(从“procError:”行到“end sub”/“exit sub”。因此,Err 在范围外不可用,因此它被隐式清除。
  • @shahkalpesh 我认为这不是真的。您可以写Goto ProcExit 而不是Resume ProcExit,然后直到Exit Sub 才会清除Err。如果 On Error Resume Next 在 ProcExit 之后被用于保护某些资源释放代码,那么即使在 Exit Sub 也不会清除 Err,并且调用者可以看到资源释放期间的任何错误。

标签: vb6 error-handling


【解决方案1】:

当您按预期退出 Sub 时,Err 对象将被清除(例如,没有发生错误)。在您的示例中,Resume ProcExit 语句是不必要的。以下两个 sub 的行为方式相同:

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 时,您将获得更多信息。

【讨论】:

    【解决方案2】:

    对于您的特定示例,您无需清除错误,因为您的模式基于捕获错误。虽然不痛:

    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
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      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
      

      您可以选择不添加错误处理程序。在这种情况下,错误将被传播到调用者(或处理它的过程)。

      请发布您想要实现的目标和您的期望的示例代码。

      编辑:这是您发布的代码的意思

      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
      

      【讨论】:

      • 这里是一个例子。不是我的。但是我想知道是否有必要这样做来清除错误,然后继续执行程序。 Public Sub SubA() On Error Goto ProcError ' 其他代码 MsgBox FuncA() ProcExit: Exit Sub ProcError: MsgBox Err.Description Resume ProcExit
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多