如果输入错误,我会尝试将错误传播给用户。
这里应该抛出错误的代码:
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吗?它会传播回控制器级别并传播给用户吗?
答案 0 :(得分:2)
在catch方法中,使用CreateErrorResponse创建一个适合HttpStatusCode的响应:
catch (ApplicationException ex)
{
transaction.Rollback();
return this.Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, ex);
}
文档中的警告:
请求必须与HttpConfiguration实例相关联。一个HttpResponseMessage,其内容是HttpError实例的序列化表示[返回]