簡體   English   中英

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

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

我正在嘗試創建一個集中的錯誤處理程序。 我按照推薦使用 vbObjectError 。 但是我不知道如何編寫一個可以確定我的錯誤是本機錯誤還是自定義錯誤的條件。

即使我稍后將其他自定義錯誤添加到枚舉中,所需的 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

這似乎可行:

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


太多不適合作為評論,但這對我有用:

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

它對您不起作用的一個可能原因可能是您在移動到處理程序之前正在結束執行。 來自關於 Err Object 的文章

Err 對象的屬性在錯誤處理例程中的 Exit Sub、Exit Function、Exit Property 或 Resume Next 語句之后重置為零或零長度字符串 ("")。

另一個潛在的問題是vbObjectError-2147221504所以通過檢查Err.Number >= vbObjectError你將為每個大於vbObjectError的數字返回True ,這基本上是所有的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM