作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
让我们假设这段代码:
模块1:
Sub main()
Dim cl As New Class2
On Error GoTo errorhandler1
cl.DoWork
On Error GoTo 0
Exit Sub
errorhandler1:
MsgBox (Err.Description)
End Sub
Event MyEvent()
Public Sub DoWork()
RaiseEvent MyEvent
End Sub
Private WithEvents cl As Class1
Private Sub cl_MyEvent()
Call Err.Raise(123, , "ErrorInClass")
End Sub
Private Sub Class_Initialize()
Set cl = New Class1
End Sub
Public Sub DoWork()
cl.DoWork
End Sub
最佳答案
这让我很生气——你可以在这个简单的 C# 代码中看到:
try
{
SomeEvent?.Invoke(this, EventArgs.Empty);
}
catch
{
// break here
}
SomeEvent
的任何处理程序抛出异常,AFAIK 中的断点
catch
block 会被击中 - 我期待 VBA 做同样的事情......但它没有。
RaiseEvent
之间存在一些问题。调用和事件处理程序:
[<Non-Basic code>]
这将是 VBA 运行时本身,将事件分派(dispatch)到正在监听该特定事件源实例上的事件的任何对象:而这种“中间人”很可能是为什么运行时错误不会冒泡的原因:运行时可能会保护自己并在此处抛出错误,无论父堆栈帧是否具有
On Error
陈述。
ErrorInfo
,并给它一些有用的成员:
Option Explicit
Private Type TErrorInfo
Number As Long
Description As String
Source As String
End Type
Private this As TErrorInfo
Public Property Get Number() As Long
Number = this.Number
End Property
Public Property Get Description() As String
Description = this.Description
End Property
Public Property Get Source() As String
Source = this.Source
End Property
Public Property Get HasError() As Boolean
HasError = this.Number <> 0
End Property
Public Property Get Self() As ErrorInfo
Set Self = Me
End Property
Public Sub SetErrInfo(ByVal e As ErrObject)
With e
this.Number = .Number
this.Description = .Description
this.Source = .Source
End With
End Sub
Public Event Something(ByVal e As ErrorInfo)
ErrorInfo
对象,调用
Err.Raise
因此,您可以正常处理该错误,在您想要处理事件处理程序错误的事件调用范围内:
Public Sub DoSomething()
On Error GoTo CleanFail
With New ErrorInfo
RaiseEvent Something(.Self)
If .HasError Then Err.Raise .Number, .Source, .Description
End With
Exit Sub
CleanFail:
MsgBox Err.Description, vbExclamation
End sub
ErrInfo
中设置错误状态。范围:
Private Sub foo_Something(ByVal e As ErrorInfo)
On Error GoTo CleanFail
Err.Raise 5
Exit Sub
CleanFail:
e.SetErrInfo Err
End Sub
Cancel
的情况一样事件,如果一个事件有多个处理程序,那么返回到事件调用站点的状态是未定义的 - 如果只有一个处理程序抛出错误,并且非抛出处理程序不会篡改
ErrorInfo
参数,那么理论上调用站点会得到一个错误。当两个或多个处理程序抛出错误时,“乐趣”就开始了。
ErrorInfo
的状态。是在他们修改它之前。
ErrorInfo
类封装了一组错误信息,并可能将索引器添加到
Property Get
成员 - 或您可以考虑的任何其他机制,以“汇总错误”。哎呀,您甚至可以封装
ErrorInfo
的集合
AggregateErrorInfo
中的实例集合类,并让您的“多听众事件”在其签名中使用它。
关于vba - On Error Goto 在 EventHandler subs 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30935147/
我是一名优秀的程序员,十分优秀!