ASP.NET捕获{}节无例外地触发

ASP.NET捕获{}节无例外地触发,asp.net,try-catch,Asp.net,Try Catch,我有个小问题。 在这段代码中,总是有catch{}段触发。即使抛出任何异常。我签入了调试器,并没有抛出异常,但不知何故,来自catch{}的代码正在启动,它将我传输到google.com。 如果我对catch{}中的代码进行注释,则页面运行正常。 有人知道为什么吗?这让我很生气。 谢谢 Response.Redirect会引发ThreadAbortException。然后点击外部异常处理程序,触发第二个响应。重定向 看 更重要的是,这是数据访问代码不应与UI行为紧密混合的一个原因。调试这样的代码

我有个小问题。 在这段代码中,总是有catch{}段触发。即使抛出任何异常。我签入了调试器,并没有抛出异常,但不知何故,来自catch{}的代码正在启动,它将我传输到google.com。 如果我对catch{}中的代码进行注释,则页面运行正常。 有人知道为什么吗?这让我很生气。 谢谢


Response.Redirect
会引发
ThreadAbortException
。然后点击外部异常处理程序,触发第二个
响应。重定向

更重要的是,这是数据访问代码不应与UI行为紧密混合的一个原因。调试这样的代码很困难,单元测试几乎不可能,可重用性也很低


看起来您的查询是通过字符串连接构造的,这很容易受到SQL注入的攻击。改为参数化查询。

响应重载。您正在使用的重定向将始终尝试并停止当前线程。这会导致您看到的异常<代码>系统.Threading.ThreadAbortException

有一个可用的重载:
Response.Redirect(字符串url,bool endResponse)
允许您使用
endResponse
参数控制是否结束当前线程

尽管如此,您可以捕获这个特定错误并忽略它。下面的建议只是您可以实施的几个解决方案之一。这完全取决于你想做什么

protected void Button5_Click(object sender, EventArgs e)
    {
        if (Page.IsValid == true)
        {
            try
            {
                conn = new MySqlConnection("Server=localhost;Port=3306;Database=ewidencja;Uid=webuser;Pwd=web1;");
                conn.Open();
                MySqlDataAdapter mda = new MySqlDataAdapter();
                mda.SelectCommand = new MySqlCommand("select id from pacjenci where pesel='" + Session["pesel"].ToString() + "';", conn);
                int id_pacjenta = (int)mda.SelectCommand.ExecuteScalar();
                int id_lekarza=Int32.Parse(DropDownList1.SelectedValue);
                mda.InsertCommand = new MySqlCommand("insert into planowane_wizyty (id_pacjenta, id_lekarza, data_wizyty) values(" + id_pacjenta + ", " + id_lekarza + ", '" + Calendar1.SelectedDate.ToString().Substring(0,10)+" "+ ListBox1.SelectedItem.Value + "');", conn);
                if (mda.InsertCommand.ExecuteNonQuery() == 1)
                    Response.Redirect("wizyty.aspx");
                else
                    Response.Redirect("info.aspx");
            }
            catch (System.Threading.ThreadAbortException)
            {
                //do nothing. This is an expected error stemming from Response.Redirect
            }
            catch (Exception ex)
            {
                Response.Redirect("http://www.google.com");
            }
        }
    }

一定有例外。。您是否在
响应上设置了断点。重定向(“http://www.google.com");
然后在命中时检查
ex
?必须在某个地方抛出异常。您是否检查了
ex
对象上的堆栈跟踪?它应该告诉您抛出了什么。取出try/catch和所有重定向,将调试器设置为在所有异常上中断,然后查看发生了什么。它说:
[System.Threading.ThreadAbortException]={无法计算表达式,因为代码已优化或本机帧位于调用堆栈顶部。}
好了:如果我错了,请纠正我,但我相信重载操作使用的总是抛出错误。有一个重载,它接受一个布尔值以不中止当前线程,但会打开一个全新的蠕虫程序。正确,该重载会引发ThreadAbortException。在我链接的问题中有更多细节。这就是为什么我建议不要将业务/数据逻辑与UI紧密耦合。正确的实现可以返回布尔值、状态、复杂类型等,从而允许UI重定向到正确的页面。没有必要用try/catch来概括这种逻辑,我完全同意。我只是想澄清这一点。
protected void Button5_Click(object sender, EventArgs e)
    {
        if (Page.IsValid == true)
        {
            try
            {
                conn = new MySqlConnection("Server=localhost;Port=3306;Database=ewidencja;Uid=webuser;Pwd=web1;");
                conn.Open();
                MySqlDataAdapter mda = new MySqlDataAdapter();
                mda.SelectCommand = new MySqlCommand("select id from pacjenci where pesel='" + Session["pesel"].ToString() + "';", conn);
                int id_pacjenta = (int)mda.SelectCommand.ExecuteScalar();
                int id_lekarza=Int32.Parse(DropDownList1.SelectedValue);
                mda.InsertCommand = new MySqlCommand("insert into planowane_wizyty (id_pacjenta, id_lekarza, data_wizyty) values(" + id_pacjenta + ", " + id_lekarza + ", '" + Calendar1.SelectedDate.ToString().Substring(0,10)+" "+ ListBox1.SelectedItem.Value + "');", conn);
                if (mda.InsertCommand.ExecuteNonQuery() == 1)
                    Response.Redirect("wizyty.aspx");
                else
                    Response.Redirect("info.aspx");
            }
            catch (System.Threading.ThreadAbortException)
            {
                //do nothing. This is an expected error stemming from Response.Redirect
            }
            catch (Exception ex)
            {
                Response.Redirect("http://www.google.com");
            }
        }
    }