我尝试使用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
答案 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方法。
答案 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语句来关闭连接并可靠地释放其他对象。