在ASP.net中将错误传播回用户

时间:2016-07-13 12:51:23

标签: c# asp.net

如果输入错误,我会尝试将错误传播给用户。

这里应该抛出错误的代码:

var sql2 = "select COD_id from COD_Codes where COD_name = @Value and COD_COT_id = @codeId";
            SqlCommand cmd2 = new SqlCommand();
            cmd2.CommandText = sql2;
            cmd2.Parameters.AddWithValue("@Value", value);
            cmd2.Parameters.AddWithValue("@codeId", result);
            cmd2.Connection = connection;
            cmd2.Transaction = transaction;
            var code = Convert.ToInt32(cmd2.ExecuteScalar());
            if (code == 0)
            {
                throw new  ApplicationException(string.Format(@"({0}) is not a valid data for this credit report. Please check with your sys admin if this is a new data value", code));
            }
            return code;

这段代码比我的控制器低几级,如下所示:

[HttpPost]
        public HttpResponseMessage SaveCreditReport(GrowData growData)
        {
            using (SqlConnection connection = CreateSqlConnection())
            {
                using (var transaction = connection.BeginTransaction())
                {
                    try
                    {
                        var service = CreateCreditService(connection, transaction);

                        var user = GetUser(service);

                        if (log.IsInfoEnabled)
                            log.InfoFormat("Save credit report called by user '{0}' ",
                                user.UserName);

                        var growValues = growData.GrowRows.Select(growRow => new GrowValue() { Mnemonic = growRow.Mnemonic, Time = growRow.Time, Value = growRow.Value }).ToList();

                        var growCompValues = growData.GrowCompRows.Select(compRow => new GrowCompRowValue() { Mnemonic = compRow.Mnemonic, Value = compRow.Value }).ToList();

                        var reportId = service.SaveGrowCreditData(user.Id, growData.CompanyId, growValues, growCompValues, growData.Publish);

                        var message = this.Request.CreateResponse<int?>(HttpStatusCode.OK, reportId);

                        transaction.Commit();

                        return message;
                    }
                    catch
                    {
                        transaction.Rollback();
                        throw;
                    }

                }
            }
        }

我不确定我需要抛出什么样的异常才能将错误传播回用户级别。我不想要标准的&#34; 500内部服务器错误&#34;消息,而是我在代码中格式化的消息。

我可以直接从代码中抛出一个新的httpresponseexception而不是ApplicationException吗?它会传播回控制器级别并传播给用户吗?

1 个答案:

答案 0 :(得分:2)

在catch方法中,使用CreateErrorResponse创建一个适合HttpStatusCode的响应:

catch (ApplicationException ex)
{
    transaction.Rollback();
    return this.Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, ex);
}  

文档中的警告:

  

请求必须与HttpConfiguration实例相关联。一个HttpResponseMessage,其内容是HttpError实例的序列化表示[返回]