【问题标题】:Try/Catch Block - Exiting from try codeTry/Catch 块 - 退出尝试代码
【发布时间】:2013-01-10 21:12:34
【问题描述】:

我有这个 C# 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.OleDb;
using System.Data;

public partial class UpdateArticle : System.Web.UI.Page
{
    public string ArticleTitle, ArticleBody, PostDate;

    protected void Page_Load(object sender, EventArgs e)
    {
        string ArticleId;
        try
        { ArticleId = Request.QueryString["ArticleId"].ToString();
            string dpath = Server.MapPath(@"App_Data") + "/MySite.mdb";
            string connectionstring = @"Data source='" + dpath + "';Provider='Microsoft.Jet.OLEDB.4.0';";
            string q = string.Format("select *  from tblArticles where ArticleId={0}", ArticleId);
            OleDbConnection con = new OleDbConnection(connectionstring);
            OleDbCommand cmd = new OleDbCommand(q, con);
            con.Open();
            cmd.ExecuteNonQuery();
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds, "tbl");
            con.Close();
            ArticleTitle = ds.Tables[0].Rows[0]["ArticleTitle"].ToString();
            ArticleBody = ds.Tables[0].Rows[0]["ArticleBody"].ToString();
            PostDate = ds.Tables[0].Rows[0]["PostDate"].ToString();


        }
        catch
        { }
        string NewArticleTitle, NewArticleDate, NewArticleBody, ArticleId1;  
        try
        {

                NewArticleTitle = Request.Form["ArticleTitle"].ToString();
                NewArticleDate = Request.Form["ArticleDate"].ToString();
                NewArticleBody = Request.Form["ArticleBody"].ToString();
                ArticleId1 = Request.QueryString["ArticleId"].ToString();
                string dpath = Server.MapPath(@"App_Data") + "/MySite.mdb";
                string connectionstring = @"Data source='" + dpath + "';Provider='Microsoft.Jet.OLEDB.4.0';";
                OleDbConnection con = new OleDbConnection(connectionstring);
                string QuaryString = string.Format("insert into tblArticles(ArticleTitle, ArticleBody, PostDate) values ('{0}','{1}','{2}') where ArticleId='{3}'", NewArticleTitle, NewArticleBody, NewArticleDate, ArticleId1);
                OleDbCommand cmd = new OleDbCommand(QuaryString, con);
                OleDbDataAdapter da = new OleDbDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds, "tbl");
                con.Close();
            }
            catch { }
       // Response.Redirect("ArticlesTable.aspx");

}}

我的代码中的问题是,当涉及到这一行时:

ArticleId1 = Request.QueryString["ArticleId"].ToString();

它从 try 块中退出。上面几行我写了这段代码:

ArticleId = Request.QueryString["ArticleId"].ToString();

而且效果很好。那么为什么下线不起作用呢? 第一次调试时:1:http://i.stack.imgur.com/CfKXL.png 在 ASPX 页面中提交表单后: 这是aspx代码:

<b>
כותרת המאמר :<br /></b><input id="Text1" type="text" name="ArticleTitle" value="<%=ArticleTitle %>"/><p></p>
<b>

תאריך פרסום: <br /></b><input id="Text2" type="text" name="ArticleDate" value="<%=PostDate %>"/><p></p>

<b>

תוכן המאמר: <br /></b> <textarea rows="10" cols="60"  name="ArticleBody"><%=ArticleBody %></textarea>
<br />
<input id="Reset1" type="reset" value="נקה" />
<input id="Submit1" type="submit" value="שלח כתבה!" />
</form>
<p></p><p></p>

<a href="Default.aspx">חזור לדף הבית</a>

在提交之后(var 没有得到 Id 值!)

【问题讨论】:

  • 捕获异常并显示异常信息。
  • MSDN using Statement -- OleDbCommandOleDbConnection 都实现了IDisposable
  • 你需要单步调试你的代码,看看发生了什么
  • 哇,我希望代码不会进入公司的应用程序。您应该使用 using 或至少关闭 finally 上的连接。此外,捕获异常而不处理它们是错过错误的好方法。你确定那是产生错误的那行吗?
  • 哦,既然没人提到它,你不应该连接字符串来创建 SQL 查询;它让您对 SQL 注入持开放态度。您应该使用参数化查询。

标签: c# try-catch request.querystring


【解决方案1】:

如果您的代码突然从 try 块中意外退出,则它正在捕获异常。

如果您的 catch 语句像 catch { } 那样丢弃该异常,那么您将永远看不到它。

您应该完全删除 try/catch 并让错误自然冒泡,或者您应该抓住它并对其进行处理:

catch (Exception ex)
{
   // However you want to handle things going wrong.
}

【讨论】:

    【解决方案2】:

    您的代码抛出异常,很可能是因为Request.QueryString["ArticleId"] 超出了范围。我不确定为什么会发生这种情况,但这是最有可能的解释。将catch {} 更改为catch (Exception e) {} 并在此处设置一个断点,以便您可以检查异常。假设这是正在发生的事情,请在第一次尝试之外声明ArticleId1,然后在设置ArticleId(在第一次尝试中)之后将其设置为行。

    【讨论】:

    • 如果查询字符串不存在,它只会返回null。我的猜测是,当他尝试 ToString 时,他只是得到了一个空指针异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多