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

问题描述 投票:0回答:1

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

这是 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 错误处理语句

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

  1. 在调用 CodeB 之前不需要下一步错误恢复
  2. 调用 CodeB 时的“On Error Goto”语句仍然存在
  3. 在调用代码 B 之后的错误捕获代码中,无需在重新引发错误之前重新设置“错误时转到”。 此重新声明会导致 err 对象被设置为空。 因此,我在重新声明之前使用变量来存储错误对象的值。

我认为上面的代码很有用并且是很好的实践。你觉得怎么样?

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

我现在感觉需要进行脑白质切除术。 错误处理正在我的头脑中......最后一个问题我在哪里可以获得一个?

哈维

vba error-handling
1个回答
0
投票

我还没有研究在 vba 中使用 err.Raise 方法,但我会尝试一下,同时有一个从函数返回多个值的通用方法,即创建一个包含属性和任何值的自定义类您需要的方法并在返回函数中创建它的本地实例,填充适当的数据并将其传回。是否可以在调用代码中对其进行操作。您可以创建自己的 ErrorObject 类并在本地应用它。

© www.soinside.com 2019 - 2024. All rights reserved.