我仍在寻求更多地了解错误处理。
这是 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 错误处理语句
上面的代码解决了这些问题并且更加简单。 即因为:
我认为上面的代码很有用并且是很好的实践。你觉得怎么样?
我怀疑有人会说,当你可以使用自己的对象时,为什么要传回 errObject...
我现在感觉需要进行脑白质切除术。 错误处理正在我的头脑中......最后一个问题我在哪里可以获得一个?
哈维
我还没有研究在 vba 中使用 err.Raise 方法,但我会尝试一下,同时有一个从函数返回多个值的通用方法,即创建一个包含属性和任何值的自定义类您需要的方法并在返回函数中创建它的本地实例,填充适当的数据并将其传回。是否可以在调用代码中对其进行操作。您可以创建自己的 ErrorObject 类并在本地应用它。