ASP.NET catch {}部分触发没有任何异常

时间:2013-01-08 20:01:44

标签: asp.net try-catch

我有点问题。 在这段代码中,始终有catch {}部分触发。即使抛出任何异常。我检查了调试器,没有例外是THROWN但是来自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");
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

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

请参阅Why Response.Redirect causes System.Threading.ThreadAbortException?

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

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

答案 1 :(得分: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");
            }
        }
    }