我有一个带有简单事件的对象Order
,
Public Event ErrorOccurred(ByVal msg As String)
当我无法找到订单时,我在构造函数中引发(沿着w /设置布尔错误标志:
RaiseEvent ErrorOccurred("This order does not exist in the database.")
[Error] = True
我订阅了订单ErrorOccurred
活动的网络表单:
Public WithEvents o As New Order
我在表单上有一个错误处理程序方法:
Private Sub OnErrorOccurred(ByVal msg As String) Handles o.ErrorOccurred
litMsg.Text = "<p class=""error-confirm"">" & msg & "</p>"
End Sub
更改文本框后,它会自动恢复到页面并使用以下逻辑:
Private Sub txtOrderID_TextChanged(ByVal sender As Object,_
ByVal e As System.EventArgs) Handles txtOrderID.TextChanged
If IsNumeric(txtOrderID.Text) Then
If o.OrderID = 0 Then o = New Order(txtOrderID.Text)
If Not o.Error Then
'do stuff'
Else
'error, run error handling'
End If
....
当出现错误时(运行Else
逻辑时),一切都按预期执行,但事件不会触发。但是,由于Error
标志设置为true,这意味着事件必须已被触发,因为该行在RaiseEvent
行之后执行。
我已经尝试了我能想到的一切,但我无法弄清楚可能出现的问题。我的项目遍布各处的活动,并且使用几乎相同的结构都可以很好地工作。我在这里做错了什么?
答案 0 :(得分:2)
我想说,既然你在构造函数中引发事件,在你甚至引用父类中的对象之前,你就无法处理事件。在这种情况下,尤其是构造函数中的错误,抛出异常可能比引发事件要好得多。我最好抛出一个异常,因为调用你的类的其他一些代码甚至可能都不会处理这个事件,你很可能想知道发生了一个错误。抛出异常是让调用代码知道发生错误的标准方法。事件更多是调用类可能想要处理的可选事物,但它也可能想要忽略。