【问题标题】:Why my try catch is not working in asp.net c#为什么我的 try catch 在 asp.net c# 中不起作用
【发布时间】:2017-06-12 15:09:12
【问题描述】:

我有这个代码

 protected void Page_Load(object sender, EventArgs e)
    {
        try
        {  
        string connstr = ConfigurationManager.ConnectionStrings["dbConn"].ConnectionString;
        SqlConnection conn = new SqlConnection(connstr);
        conn.Open();
        SqlCommand cmdLoad = new SqlCommand(" *Connection string* ");
        cmdLoad.CommandType = System.Data.CommandType.Text;
        cmdLoad.Connection = conn;
        SqlDataReader rd = cmdLoad.ExecuteReader();
        StringBuilder resultsHtml = new StringBuilder();
        while (rd.Read())
        {
            resultsHtml.Append("<tr class'odd gradeX'>");
            resultsHtml.Append("<td>" + rd["region_location"].ToString() + "</td>");
            resultsHtml.Append("</tr>");
        }
        resultsPlaceHolder.Controls.Add(new Literal { Text = resultsHtml.ToString() });
        rd.Dispose();
        conn.Close();
             }
        catch (Exception ex)
        {
            Response.Write("Cant connect to database");
            throw ex;
        }
    }

在我的 web.config 中,我输入了正确的连接字符串,它当然会运行并执行 try 对吗?但是,当我更改连接字符串(数据库中没有的内容)时,我无法让Response.Write(); 向浏览器显示某些内容。如果 try 中出现异常,如何在屏幕上显示一些内容?

【问题讨论】:

  • 您可以使用Response.Redirect 显示另一个页面,该页面包含存储在会话状态中的异常消息,而不是使用Response.Write 将写入同一页面。
  • 因为throw ex 会打断您的手动响应。 ASP 管道有自己的错误处理。删除throw ex(通常也应该是throw - 否则你会擦除堆栈strace)
  • 您还应该考虑使用Repeater 或其他类型的模板控件来显示您的数据,而不是使用字符串构建表格行并将它们转储到文字中。

标签: c# asp.net error-handling


【解决方案1】:

这是因为Response.Write() 后面的throw ex;。如果你把它拿出来,事情应该会如你所愿。

既然已经排序了,我建议几点:

  • 如果您尝试自定义错误处理逻辑,我建议您 检查this MSDN article,这是一种更好的接近方式 东西。
  • 当您想重新引发异常时,您应该使用 throw; 而不是 throw ex;,这不会保留您的堆栈跟踪。
  • 如果出现您的问题中提到的故障,例如无法连接到数据库,您可能希望记录这些异常并向最终用户提供适当的反馈,这对他们来说更有意义:

无法连接数据库

这可能是一条消息,表示网站遇到问题,并要求他们稍后再试,同时有人正在调查该问题。

【讨论】:

    【解决方案2】:

    有几种 try/catch 模式。你用错了

    如果您希望完全处理错误并继续 这就是你想要的

    try
    {
        DoSomething();
    }
    catch(SomeException ex)
    {
        HandleTheError();
    }
    

    如果您希望让错误传播,但想添加一些逻辑,例如日志记录

    try
    {
        DoSomething();
    }
    catch(SomeException ex)
    {
        LogTheError(ex);
        throw;
    }
    

    如果您希望抛出异常,但希望隐藏代码的内部运作 这是你用的那个

    try
    {
        DoSomething();
    }
    catch(SomeException ex)
    {
        LogTheError(ex);
        throw ex;
    }
    

    或

    try
    {
        DoSomething();
    }
    catch(SomeException ex)
    {
        LogTheError(ex);
        throw new OtherException("Custom message");
    }
    

    如果你想默默地接受错误

    try
    {
        DoSomething();
    }
    catch(SomeException ex)
    {
    }
    

    【讨论】:

    • 您好,您拥有catch(SomeException ex) 的第一个代码,但是我确定我以前做过,有一个警告说ex 已声明但从未使用过。那为什么还要声明呢?
    • 这些只是示例。如果是这个实际代码,catch 块可能会对 ex 做一些事情,例如检查其类型并采取适当的措施。
    【解决方案3】:

    在你的捕获中使用以下内容:

    Response.ClearHeaders();
    Response.Write("Cant connect to database");
    Response.End();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多