Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Try/Catch错误地失败_Asp.net_Vb.net_Try Catch - Fatal编程技术网

Asp.net Try/Catch错误地失败

Asp.net Try/Catch错误地失败,asp.net,vb.net,try-catch,Asp.net,Vb.net,Try Catch,我正在尝试使用Try/Catch处理与数据库的潜在连接失败。Catch部分有一个Response.Redirect命令。无论Try部分中的代码是否失败,只要页面加载,它就会根据Catch部分重定向 如果我注释掉Catch部分中的Response.Redirect命令,页面将正常加载。类似地,如果我用代码替换Response.Redirect命令,用捕获的假定错误填充页面上的控件,Try部分将成功。这是关于有回应的问题。在Catch部分重定向 Private Sub Page_Load(Sende

我正在尝试使用Try/Catch处理与数据库的潜在连接失败。Catch部分有一个Response.Redirect命令。无论Try部分中的代码是否失败,只要页面加载,它就会根据Catch部分重定向

如果我注释掉Catch部分中的Response.Redirect命令,页面将正常加载。类似地,如果我用代码替换Response.Redirect命令,用捕获的假定错误填充页面上的控件,Try部分将成功。这是关于有回应的问题。在Catch部分重定向

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
Response.Redirect()
不带第二个参数
False
将生成
ThreadAbortException
,因为
响应
对象上调用了
.End()
,所以问题出在以下几行:

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()
,因此不会生成
线程中止异常

根据MSDN文件:

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

阅读以了解更多信息。

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()
,因此不会生成
线程中止异常

根据MSDN文件:

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


阅读了解更多信息。

我认为问题与其他响应有关。重定向语句:

If dbReader("PortalEnabled") = True Then
    Response.Redirect("~/SubmitWizard.aspx")
Else
    Response.Redirect("~/Maintenance.aspx")
End If
重定向总是抛出ThreadAbortException。当它捕获任何异常时,它会在异常处理程序中捕获。要么替换Reponse.Redirect调用,要么添加一个处理程序来捕获ThreadAbortExceptions:

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

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

我认为问题与其他响应有关。重定向语句:

If dbReader("PortalEnabled") = True Then
    Response.Redirect("~/SubmitWizard.aspx")
Else
    Response.Redirect("~/Maintenance.aspx")
End If
重定向总是抛出ThreadAbortException。当它捕获任何异常时,它会在异常处理程序中捕获。要么替换Reponse.Redirect调用,要么添加一个处理程序来捕获ThreadAbortExceptions:

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

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

Try-Response.Redirect(~/Maintenance.aspx),false)除非Try-one中出现错误,否则无法访问Catch部分。确认Response.Redirect(“~/Maintenance.aspx”)没有写入代码中的其他任何地方,并且给定的情况实际上没有被捕获(可能您预期某个错误不会发生;但会出现另一个错误)。如果dbReader(“PortalEnabled”)=True,则该行
可能会引发异常
dbReader(“PortalEnabled”)
返回一个
对象
,如果不首先将其强制转换为
布尔值,则无法将其与true进行比较。请尝试响应。重定向(~/Maintenance.aspx),false)除非在Try部分中出现错误,否则无法访问Catch部分。确认Response.Redirect(“~/Maintenance.aspx”)没有写入代码中的其他任何地方,并且给定的情况实际上没有被捕获(可能您预期某个错误不会发生;但会出现另一个错误)。如果dbReader(“PortalEnabled”)=True,则该行
可能会引发异常
dbReader(“PortalEnabled”)
返回一个
对象
,如果不先将其转换为
boolean
,则无法将其与true进行比较。您可以控制
是否响应。重定向()
使用重载版本抛出
线程异常
,重载版本接受
布尔值
参数作为
endResponse
True
是默认值,它会导致您提到的线程中止条件。更多信息请参见我的答案。是的,你是对的。另一方面,如果我已经知道我想重定向并且不做任何其他事情(除了释放资源),那么这个异常就不是太糟糕了。sqlcon.Close()语句是否不能令人满意地关闭连接?只有在它运行时;如果之前抛出异常,则不会执行。因此,我建议使用Using block(),比如使用sqlCon作为新的SqlConnection(…),然后在您不再需要它的时候使用End Using。您可以控制
Response.Redirect()
是否抛出
ThreadAbortException
,方法是使用接受
布尔值的重载版本