asp.net vb codebehind try ... catch问题

时间:2011-06-28 14:37:45

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

在代码隐藏中,我有以下内容:

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSubmit.Click
    Dim sql As String
    Dim conn As OleDbConnection
    Dim cmd As OleDbDataAdapter
    Dim ds As DataSet
    Dim tbl As DataTable

    conn = New OleDbConnection("Provider=SQLOLEDB;Data Source=(local);Initial Catalog='library';Integrated Security=SSPI;")
    Try
        sql = "SELECT f1, f2, f3 FROM mydb WHERE ltrim(rtrim(UPPER(username))) = 'MYNAME'"

        cmd = New OleDbDataAdapter(sql, conn)
        ds = New DataSet
        cmd.Fill(ds)
        tbl = New DataTable
        tbl = ds.Tables(0)

        If tbl.Rows.Count = 0 Then
            Response.Redirect("goback.html")
        End If

        Response.Redirect("dummy.html")

    Catch ex As Exception
        Response.Redirect("goback2.html")
    End Try

End Sub

该例程适用于某一点。我可以检查tbl.Rows.Count = 1的值,所以它应该重定向到“dummy.html”,只要我注释掉重定向到“goback2.html”的行,它就会正确。

如果我取消注释该行以重定向到goback2,那么它会转到“goback2.html”

我认为如果前面的代码中有一些错误,它应该只执行该代码 - 但是如果它执行,则前一代码中不会出现错误。就像它正在执行catch代码而不管我要去的是什么。

奇怪的是,它只会让重定向变得混乱!如果我将重定向替换为goback2并赋值给textbox.text然后它可以工作(通过忽略该代码) - 但重定向它似乎执行,无论它是否应该采取捕获

4 个答案:

答案 0 :(得分:4)

Response.Redirect(string)在调用Response.End()时抛出ThreadAbortException

使用带字符串和布尔值的重载:

Response.Redirect("goback.html", false);

来自MSDN:第二个参数endResponse“表示当前页面的执行是否应该终止。”

答案 1 :(得分:3)

Response.Redirect会抛出ThreadAbortException来终止当前请求。

您的Catch阻止了该异常。

答案 2 :(得分:2)

由于Response.Redirect,可能是因为ThreadAbortedException。 - MSDN support link

答案 3 :(得分:1)

您尚未打开连接。您无法在Try / Catch中重定向。你应该设置一个布尔变量successfalse并在Try / Catch / Finally之后检查它,如果设置为false则重定向。

看看这个SO-Question:Is there something that prevents Response.Redirect to work inside try-catch block?

这会更好:

    Dim success As Boolean = True
    Dim ds As New DataSet
    Using conn As New OleDb.OleDbConnection("Provider=SQLOLEDB;Data Source=(local);Initial Catalog='library';Integrated Security=SSPI;")
        Try
            Dim Sql = "SELECT f1, f2, f3 FROM mydb WHERE ltrim(rtrim(UPPER(username))) = 'MYNAME'"
            Dim cmd = New OleDb.OleDbDataAdapter(Sql, conn)
            conn.Open()
            cmd.Fill(ds)
        Catch ex As Exception
            success = False
        End Try
    End Using
    If Not success Then
        Response.Redirect("goback2.html")
    ElseIf ds.Tables.Count <> 0 AndAlso ds.Tables(0).Rows.Count = 0 Then
        Response.Redirect("goback.html")
    Else
        Response.Redirect("dummy.html")
    End If