Vba 将错误对象传递回调用代码-这是一种好的做法吗?

Vba 将错误对象传递回调用代码-这是一种好的做法吗?,vba,error-handling,Vba,Error Handling,我仍在探索如何更好地理解错误处理 这是fmsinc.com发给我的一些代码。我很喜欢它,为什么我以前没见过这种东西呢。我正在考虑重新构造一些代码以使用这种技术。我的问题是我应该吗?这样做是好的做法吗 下面的代码应该有助于您让CodeB将其错误或状态延迟到CodeA,它可能有助于在CodeB过程中捕获错误,然后将其返回给CodeA子/函数 下面的示例还允许CodeB过程完成,而不管遇到什么错误(如果有),并延迟应用程序对CodeA过程的响应 Public Sub CodeB(perrO As Er

我仍在探索如何更好地理解错误处理

这是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
公共子代码B(perrO作为错误对象)
作为整数的Dim i
出错时继续下一步
i=100/0
设置perrO=err
'此处的代码还可以继续运行
'错误仍将在0中发回
端接头
私有子代码a()
'这表示处理用户的顶级代码
作为ErrObject的Dim errO
关于错误转到程序错误
“这里有很多代码
呼叫代码B(errO)
如果错误号为0,则
发生MsgBox“错误”和“&”错误编号和“&”
“你可能在这里犯了个错误。
如果结束
程序退出:
出口接头
过程错误:
'GlobalErrorHandler以记录错误(文本文件、数据库表、电子邮件)
恢复程序退出
不应使用“GoTo PROC_EXIT”,因为这不会导致错误。清除
'并使“on error goto PROC_ERR”处于活动状态,可能
端接头
我还编写了在CodeB中使用Err.Raise的其他代码,以便CodeA能够捕获它并响应错误。这会导致各种各样的问题,如果您看看我在这里提交的代码,您可能会很感激

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

  • 在调用CodeB之前,无需执行错误恢复下一步
  • 调用CodeB时在位的“On Error Goto”语句保持在位
  • 在调用代码B之后的错误捕获代码中,在重新引发错误之前,不需要重新恢复“on error goto”。此重新安装将导致err对象设置为nothing。因此,在重新恢复之前,我使用变量来存储错误对象的值
  • 我认为顶层代码是有用的,也是很好的实践。你觉得怎么样

    我怀疑有人会说,当你可以使用你自己的

    我现在觉得需要做脑叶切除术。错误处理让我头疼。。。。最后一个问题我在哪里可以买到


    Harvey

    在什么情况下,
    CodeB
    中发生错误可以安全地完全忽略,但在“成功”完成后会导致
    CodeA
    失败?这有一种非常刺鼻的代码气味,如果我在任何地方遇到它,这将是结构问题的提示。在每个可能引发错误的语句之后,您不需要在
    CodeB
    中重复这行代码吗?此外,如果您有两个错误,则可能会丢失原始错误。@Chipsleten Yes。或者使用codeB中的错误处理程序分配并返回错误对象参数(在这种情况下,您不会丢失错误)。但它让您可以选择继续执行代码,在多个参数中记录错误并传回多个错误,以便调用代码可以决定它想要做什么……根据CodeB和其他调用过程提供的证据。@Comintern。CodeA向CodeB索要3样东西怎么样。CodeB可以从10个不同的地方获得这三样东西。CodeB试图得到这三样东西,它得到了2,但是一个错误阻止了它得到第三样东西。它传递pack3错误对象(其中只有一个是非0的),并返回它找到的两个对象。CodeA决定它可以对给定的对象执行什么操作。这可能会导致给用户一个错误,或者CodeA可能决定做其他事情,而不给用户和错误。您描述的情况听起来不像CodeB中的异常-听起来像CodeA中可能的异常。CodeA不应该关心导致它只返回2个而不是3个东西的底层异常-相反,如果它不能处理它从CodeB返回的东西集,它应该引发一个异常。这也将表明该准则的结构方式不符合荣誉。