1

我有一个小问题。在这段代码中,总是有 catch{} 部分触发。即使抛出任何异常。我检查了调试器,没有例外是抛出,但不知何故来自 catch{} 的代码正在触发,它将我转移到 google.com。如果我从 catch{} 注释代码,Page 运行良好。有人知道这是为什么吗?这让我很生气。谢谢

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 (Exception ex)
            {
                Response.Redirect("http://www.google.com");
            }
        }
    }
4

2 回答 2

3

Response.Redirect可以扔一个ThreadAbortException。然后这会命中外部异常处理程序,触发第二个Response.Redirect.

请参阅为什么 Response.Redirect 会导致 System.Threading.ThreadAbortException?

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

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

于 2013-01-08T20:10:41.610 回答
0

您正在使用的 Response.Redirect 的重载将始终尝试停止当前线程。这会导致您看到的异常。System.Threading.ThreadAbortException

有一个重载可用:Response.Redirect(string 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");
            }
        }
    }
于 2013-01-08T21:06:52.997 回答