Asp.net 如何处理新对象上发生异常的自定义事件

Asp.net 如何处理新对象上发生异常的自定义事件,asp.net,vb.net,exception-handling,event-handling,Asp.net,Vb.net,Exception Handling,Event Handling,我正在创建一个新对象,该对象将字符串值作为唯一的构造函数传递 Dim o As New Widget("widgetname") 在我的小部件构造函数中,发生异常,我引发事件和事件处理程序 Public Class Widget Public Event ConnectionException As EventHandler Sub New(ByVal name As String) _name= f RaiseEvent Connection

我正在创建一个新对象,该对象将字符串值作为唯一的构造函数传递

Dim o As New Widget("widgetname")
在我的小部件构造函数中,发生异常,我引发事件和事件处理程序

Public Class Widget
    Public Event ConnectionException As EventHandler

    Sub New(ByVal name As String)
        _name= f
        RaiseEvent ConnectionException(Me, New EventArgs())
    End Sub
End Class
在调用小部件的页面上,我创建对象,声明侦听器

Dim o = New Widget("widgetname")
AddHandler o.ConnectionException, AddressOf ConnectionError
和处理程序例程

Sub ConnectionError(ByVal sender As Object, ByVal e As EventArgs)
    Response.Write("Computer says no.")
End Sub
从逻辑和语法上讲,我认为这是有意义的,但是没有显示任何内容,并且显示异常错误


我在引用事件处理程序时是否做错了什么

您正在构造函数中引发事件,但在构造函数完成之前,您不会附加事件处理程序,因此在您开始侦听事件时,事件已经来了又走了。使用事件无法解决这一问题,因为只有在拥有对对象的引用时,才能处理对象的事件,而在构造函数完成时,才能拥有该引用。您需要在构造函数中设置一个属性,然后在创建对象后测试该属性。

首先,在连接连接错误事件之前,在代码中调用构造函数。理论上,如果初始化构造函数时出错,则不会触发该事件

Dim o As New Widget("widgetname")

我会考虑把连接打开成一个打开的子。这样,在初始化对象之后,你就可以把你的事件连接起来。然后调用open,就像IDbConnection一样工作,尽管它只是抛出一个异常,不引发任何事件。

我没有看到任何异常处理。那么我说的对吗?在.NET环境中,如果没有引用构造函数方法,就不可能有处理程序?你刚才问的没有实际意义,但我会问重申你不能处理一个不存在的对象的事件,一个不存在的对象直到它的构造函数完成才存在。那么,最好的方法是如何优雅地处理异常失败,而不是web应用程序中的黄屏死亡?最好是把它放在一个尝试…捕捉…最后。并添加一个属性IsConnected来测试连接是否工作?