Vba 将错误对象传递回调用代码-这是一种好的做法吗?
我仍在探索如何更好地理解错误处理 这是fmsinc.com发给我的一些代码。我很喜欢它,为什么我以前没见过这种东西呢。我正在考虑重新构造一些代码以使用这种技术。我的问题是我应该吗?这样做是好的做法吗 下面的代码应该有助于您让CodeB将其错误或状态延迟到CodeA,它可能有助于在CodeB过程中捕获错误,然后将其返回给CodeA子/函数 下面的示例还允许CodeB过程完成,而不管遇到什么错误(如果有),并延迟应用程序对CodeA过程的响应Vba 将错误对象传递回调用代码-这是一种好的做法吗?,vba,error-handling,Vba,Error Handling,我仍在探索如何更好地理解错误处理 这是fmsinc.com发给我的一些代码。我很喜欢它,为什么我以前没见过这种东西呢。我正在考虑重新构造一些代码以使用这种技术。我的问题是我应该吗?这样做是好的做法吗 下面的代码应该有助于您让CodeB将其错误或状态延迟到CodeA,它可能有助于在CodeB过程中捕获错误,然后将其返回给CodeA子/函数 下面的示例还允许CodeB过程完成,而不管遇到什么错误(如果有),并延迟应用程序对CodeA过程的响应 Public Sub CodeB(perrO As Er
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能够捕获它并响应错误。这会导致各种各样的问题,如果您看看我在这里提交的代码,您可能会很感激
上面的代码解决了这些问题,而且更简单。因为:
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返回的东西集,它应该引发一个异常。这也将表明该准则的结构方式不符合荣誉。