最佳方式在发生DBupdateexception时为用户显示用户友好的错误消息

时间:2013-11-22 16:44:55

标签: c# asp.net-mvc entity-framework-5

我的操作方法中包含以下代码:

Try {
    repository.Save();
    DetailBox b = new DetailBox() { 
        Tag = repository.getTechnologyTagByIT360ID(resourceid) 
    };

    return PartialView("_detailBox", b);
}
catch (DbUpdateException e)
{
    ModelState.AddModelError(string.Empty, "Error occurred:" +
        e.InnerException.InnerException.Message);
}

目前,如果发生DbUpdatException,它将向用户显示以下错误:

  

•发生错误:违反UNIQUE KEY约束'IX_Technology_2'。   无法在对象'dbo.Technology'中插入重复键。重复   键值是(18605)。声明已经终止。

哪个不是很糟糕,但与此同时,它不是非常用户友好。现在有很多原因可能导致DbUpateException,因此我无法定义自己的消息。那么,我应该采取哪种方法?例如,我是否应该编写一种服务方法来检查repository.Save();之前数据库中是否已存在重复键值(18605)?

2 个答案:

答案 0 :(得分:1)

消息是否“用户友好”取决于您的应用程序用户域。

如何向客户端发送错误消息,我通常以这种方式处理:

ASP.NET控制器中的

发生错误时写:

Response.StatusCode = (int)HttpStatusCode.BadRequest;
..
return Json(errorDataObjectInstance);

在假设的ajax请求的客户端会引发error事件

$.ajax( {

    ...
     error: errorHandler //this one will be called.
});

之后,自然地,使用一些客户端UI框架(例如bootstrap)以某种方式向用户显示该信息。

答案 1 :(得分:1)

捕获异常是您处理意外情况时所做的事情,通常是在与您无法控制的系统(如文件系统,服务和是,数据库)进行交互时。

但例外应该是 - 例外。也就是说,无论何时你能预料到它们,你都应该设法防止它们被抛出。您永远不应该将它们用于程序流控制。因此,如果用户可以输入重复的数据库条目,请先检查并在违反约束时返回正确的消息。这是用户输入的正常验证的一部分。与数据库字段的字符串值太长时不允许发生异常相同。

最后的捕获应该仍然存在,但是现在它真的变成了异常,也就是说,当在检查和检查之间的微小时间间隔内并发用户输入相同的值时提交。