简体   繁体   English

VBA:如何确定是否使用了 vbObjectError?

[英]VBA: How to Determine if vbObjectError Was Used?

I'm trying to create a centralized error handler.我正在尝试创建一个集中的错误处理程序。 I'm using vbObjectError as recommended.我按照推荐使用 vbObjectError 。 But i can't figure out how to compose a conditional which can determine if my error is native or custom.但是我不知道如何编写一个可以确定我的错误是本机错误还是自定义错误的条件。

The desired IsCustomErr should work without modification even if i later add additional custom errors to the enum.即使我稍后将其他自定义错误添加到枚举中,所需的 IsCustomErr 也应该可以正常工作。

Enum CustomEr
          LaidEgg = vbObjectError
          UserEaten
          Paused
          Cancelled
End Enum


Sub Test
          On Error Goto HANDLER
          Err.Raise LaidEgg
          Exit Sub
HANDLER:
          GlobalHandler
End Sub


Sub GlobalHandler
          If IsCustomErr Then MsgBox "Custom"
End Sub


Function IsCustomErr()As Boolean
' ONE OF THESE?
          With Err
                    IsCustomErr = .Number < 0
                    IsCustomErr = .Number >= vbObjectError
                    IsCustomErr = (.Number >= vbObjectError) And (.Number < 0)
                    IsCustomErr = .Number Or vbObjectError
                    IsCustomErr = TwosComplement(.Number) Or TwosComplement(vbObjectError)
          End With
End Function

This seems viable:这似乎可行:

Enum CustomEr
    [_First]
    laidegg
    UserEaten
    paused
    Cancelled
    [_Last]
End Enum

Sub Test1()
    Debug.Print "Test1"
    On Error GoTo HANDLER
    Err.Raise vbObjectError + laidegg
    Exit Sub
HANDLER:
    GlobalHandler
End Sub

Sub Test2()
    Debug.Print "Test2"
    On Error GoTo HANDLER
    Debug.Print 1 / 0
    Exit Sub
HANDLER:
    GlobalHandler
End Sub

Sub GlobalHandler()
    Debug.Print "Custom?", IsCustomErr()
End Sub

Function IsCustomErr() As Boolean
    Dim v As Long
    For v = CustomEr.[_First] To CustomEr.[_Last]
      If (Err.Number - vbObjectError) = v Then
           IsCustomErr = True
           Exit For
      End If
    Next v
End Function


Too much to fit as a comment, but this is working for me:太多不适合作为评论,但这对我有用:

Enum CustomEr
          LaidEgg = vbObjectError
          UserEaten
          Paused
          Cancelled
End Enum

Function IsCustomErr() As Boolean
    IsCustomErr = Err.Number >= CustomEr.LaidEgg And Err.Number <= CustomEr.Cancelled
End Function

Sub Example()

    On Error Resume Next
    Err.Raise CustomEr.UserEaten
    Debug.Print IsCustomErr
    'True
    
    Err.Clear
    
    Err.Raise 1
    Debug.Print IsCustomErr
    'False
End Sub

A possible reason that it doesn't work for you might be that you are Ending execution before moving to the handler.它对您不起作用的一个可能原因可能是您在移动到处理程序之前正在结束执行。 From the article on the Err Object:来自关于 Err Object 的文章

The Err object's properties are reset to zero or zero-length strings ("") after an Exit Sub, Exit Function, Exit Property, or Resume Next statement within an error-handling routine. Err 对象的属性在错误处理例程中的 Exit Sub、Exit Function、Exit Property 或 Resume Next 语句之后重置为零或零长度字符串 ("")。

Another potential issue is that vbObjectError is -2147221504 so by checking Err.Number >= vbObjectError you will return True for every number larger than vbObjectError which is basically all of them.另一个潜在的问题是vbObjectError-2147221504所以通过检查Err.Number >= vbObjectError你将为每个大于vbObjectError的数字返回True ,这基本上是所有的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM