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

C# 在ASP.net中将错误传播回用户,c#,asp.net,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.AddWithValu

如果用户的输入错误,我试图将错误传播回用户

以下是引发错误的代码:

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;
                    }

                }
            }
        }
[HttpPost]
公共HttpResponseMessage SaveCreditReport(GrowData GrowData)
{
使用(SqlConnection=CreateSqlConnection())
{
使用(var transaction=connection.BeginTransaction())
{
尝试
{
var service=CreateCreditService(连接、事务);
var user=GetUser(服务);
if(log.isinfo已启用)
InfoFormat(“保存由用户“{0}”调用的信用报告,
用户名);
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(HttpStatusCode.OK,reportId);
Commit();
返回消息;
}
抓住
{
transaction.Rollback();
投掷;
}
}
}
}
我不确定如何以及需要抛出什么样的异常才能将错误传播回用户级别。我不想要标准的“500内部服务器错误”消息,而是我在代码中格式化的消息

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

在catch方法中,使用适当的HttpStatusCode创建响应:

catch (ApplicationException ex)
{
    transaction.Rollback();
    return this.Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, ex);
}  
文档中的警告:

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


非常感谢。它现在工作得很好。用户会很高兴知道他们做错了什么:)