将错误对象传递回调用代码 - 这是一种好习惯吗?

时间:2015-06-23 21:33:49

标签: vba error-handling

我仍然在寻求更多地理解错误处理。

这是fmsinc.com发给我的一些代码。我很喜欢它,所以为什么我之前没有看到这种事情。我正在考虑重新使用我的一些代码来使用这种技术。我的问题是我应该吗?这样做是好的做法吗?

下面的代码应该有助于CodeB将其错误或状态推迟到CodeA,它可能有助于在CodeB过程中简单地捕获错误,然后将其返回到CodeA子/函数。

下面的示例也允许CodeB过程完成而不管遇到的错误(如果有的话),并将应用程序的响应推迟到CodeA过程。

Public Sub CodeB(perrO As ErrObject)
  Dim i As Integer

  On Error Resume Next
  i = 100 / 0

  Set perrO = err

  ' code here could continue to run yet 
  ' the error will still be sent back in perr0

End Sub

Private Sub CodeA()

  ' This represents the top level code that deals with the user

  Dim errO As ErrObject

  on error goto PROC_ERR

  ' lots of code here

  Call CodeB(errO)

  If errO.Number <> 0 Then
    MsgBox "Error" & " " & errO.Number & " " & "has occured." 
    ' You might have done an err.raise here instead.
  End If



PROC_EXIT:
  Exit Sub

PROC_ERR:
  ' GlobalErrorHandler to log the error (text file, database table, email)

  Resume PROC_EXIT
  ' GoTo PROC_EXIT Should not be used as this does no do Err.Clear 
  ' and leaves the  "on error goto PROC_ERR" active, potentially
End Sub

我编写了其他在CodeB中使用Err.Raise的代码,以便CodeA可以捕获它以响应错误。如果您查看我在此处提交的代码https://codereview.stackexchange.com/questions/94415/try-catch-statement-in-vba-using-the-standard-vba-error-handling-statements

,这会导致您可能会感兴趣的各种问题

上面的代码解决了这些问题并且更加简单。即因为:

  1. 否错误在调用CodeB
  2. 之前需要接下来恢复
  3. 调用CodeB时的“On Error Goto”语句仍然存在
  4. 在调用代码B之后的错误捕获代码中,在重新引发错误之前无需重新启动“on error goto”。这种重新安装会导致错误的对象被设置为空。因此,我使用的变量在重新安装之前存储错误对象的值。
  5. 我认为顶级代码是有用且良好的做法。你觉得怎么样?

    我怀疑有人会说当你可以使用自己的时候为什么要回到errObject ...

    我觉得此刻需要进行脑叶切除术。错误处理是我的头脑....最后一个问题我在哪里可以获得一个?

    哈维

0 个答案:

没有答案