尝试/捕获失败错误

时间:2013-11-05 16:00:50

标签: asp.net vb.net try-catch

我尝试使用Try / Catch来处理与数据库的潜在失败连接。在Catch部分中有一个Response.Redirect命令。每当页面加载时,它都会根据Catch部分重定向,以确定Try部分中的代码是否失败。

如果我在Catch部分注释掉Response.Redirect命令,页面加载就好了。类似地,如果我用代码替换Response.Redirect命令来填充页面上的控件,并假设错误被捕获,则Try部分成功。它是关于在Catch部分中使用Response.Redirect ...

Private Sub Page_Load(Sender As Object, e As eventargs) Handles Me.Load

    Try
        Dim sqlcon As New System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("SarcoidsConnectionString").ConnectionString)
        Dim cmd As New System.Data.SqlClient.SqlCommand("SELECT PortalEnabled FROM [tlkSettings]", sqlcon)
        sqlcon.Open()
        Dim dbReader As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader()
        If dbReader.HasRows Then
            While dbReader.Read()
                If dbReader("PortalEnabled") = True Then
                    Response.Redirect("~/SubmitWizard.aspx")
                Else
                    Response.Redirect("~/Maintenance.aspx")
                End If
            End While
        End If
        sqlcon.Close()
    Catch ex As Exception 'Display Maintenance page if database cannot be connected to
        Response.Redirect("~/Maintenance.aspx")
    End Try

End Sub

2 个答案:

答案 0 :(得分:3)

没有Response.Redirect()的第二个参数的

False将生成ThreadAbortException,因为在.End()对象上调用Response,因此以下行是问题:

If dbReader("PortalEnabled") = True Then
    Response.Redirect("~/SubmitWizard.aspx")
Else
    Response.Redirect("~/Maintenance.aspx")
End If

将其更改为:

If dbReader("PortalEnabled") = True Then
    Response.Redirect("~/SubmitWizard.aspx", False)
Else
    Response.Redirect("~/Maintenance.aspx", False)
End If

Redirect()的第二个参数是endResponse值,当设置为False时,这会告诉响应不调用.End(),因此不会生成ThreadAbortException 1}}。

根据MSDN文档:

  

在页面处理程序中使用此方法终止对一个页面的请求并为另一个页面启动新请求时,请将endResponse设置为false,然后调用CompleteRequest方法。如果为endResponse参数指定true,则此方法为原始请求调用End方法,该方法在完成时抛出ThreadAbortException异常。此异常对Web应用程序性能有不利影响,这就是建议为endResponse参数传递false的原因。有关更多信息,请参阅End方法。

阅读HttpResponse.Redirect Method documentation了解详情。

答案 1 :(得分:1)

我认为问题与其他Response.Redirect语句有关:

If dbReader("PortalEnabled") = True Then
    Response.Redirect("~/SubmitWizard.aspx")
Else
    Response.Redirect("~/Maintenance.aspx")
End If

Response.Redirect始终抛出ThreadAbortException。这会捕获您的异常处理程序,因为它捕获任何异常。要么替换Reponse.Redirect调用,要么添加一个捕获ThreadAbortExceptions的处理程序:

Try
    '...
Catch threadAbort As ThreadAbortException
    Throw
Catch ex As Exception
    '...
End Try

顺便说一下:你应该添加一些Using语句来关闭连接并可靠地释放其他对象。