[英]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.