【问题标题】:elmah does not throw error page after implementing catch block实施 catch 块后,elmah 不会抛出错误页面
【发布时间】:2017-08-08 16:37:26
【问题描述】:

我有从 GetTaskDetails 方法获取结果的操作方法。

public ActionResult Details(int id)
        {           
            Tasks task = this._projectService.GetTaskDetails(id);

            return View(task);
        }

        public Tasks GetTaskDetails(int taskId)
        {
            SqlDataReader rdr = null;
            Tasks task = null;

            using (var conn = new SqlConnection(connectionString))
            {
                SqlCommand comm = new SqlCommand("usp_TaskGetByTaskId", conn);
                comm.CommandType = CommandType.StoredProcedure;
                comm.Parameters.AddWithValue("@TaskId", taskId);
                try
                {
                    conn.Open();
                    rdr = comm.ExecuteReader();

                    if (rdr.HasRows)
                    {
                        if (rdr.Read())
                        {
                            task = new Tasks()
                            {
                                UniqueId = Convert.ToInt16(rdr["UniqueId"]),
                                ProjectId = Convert.ToInt16(rdr["ProjectId"]),
                                Sequence = Convert.ToInt16(rdr["Sequence"]),
                                Description = rdr["Description"].ToString(),
                                StaffId = Convert.ToInt16(rdr["StaffId"]),
                                StatusId = Convert.ToInt16(rdr["StatusId"]),
                                HeldBy = rdr["HeldBy"].ToString(),
                                Progress = rdr["Progress"].ToString()
                            };
                        }
                    }
                }               
                finally
                {
                    conn.Close();
                }
            }
            return task;
        }

如果没有 catch 块,elmah 会在数据库中记录错误并重定向到我想要的错误页面。但是代码没有得到 catch 块。 但是如果有一个 catch 块添加到 GetTaskDetails 方法如下

catch (Exception ex)
{
    ErrorSignal.FromCurrentContext().Raise(ex);                 
}

错误被记录到数据库并且控件返回到操作方法而不抛出错误页面。 有没有办法让 catch 块记录到数据库然后抛出错误页面而不是重定向到控制器?我不确定我在想什么是正确的方法,或者它是否需要在控制器操作方法中再次处理异常。

【问题讨论】:

    标签: asp.net-mvc elmah


    【解决方案1】:

    登录ELMAH后可以抛出异常,会导致错误页面显示:

    catch (Exception ex)
    {
        ErrorSignal.FromCurrentContext().Raise(ex);                 
        throw;
    }
    

    我认为这样做没有任何好处,因为该解决方案的工作方式与没有 catch 块时完全一样。也许你可以在这里解释更多关于你想要实现的目标?我真的看不出你的问题有什么问题。

    【讨论】:

    • Try block without catch 对我来说似乎没有说服力。这真的是最佳实践吗?可以请教
    • ELMAH 的整个想法是记录未捕获的异常。如果您想处理代码中的已知错误,您应该使用 try-catch 并重定向到错误页面或您的 catch 中的类似内容来处理它。如果处理已知错误,我不建议登录到 ELMAH,因为这应该是一个真正要修复的错误列表。
    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2017-01-14
    • 2021-11-17
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多