是否有任何建议将数据访问层的错误消息提供给视图?

时间:2017-01-16 16:09:37

标签: asp.net-mvc error-handling architecture custom-error-handling

我想知道什么是最佳实践,或者是从数据访问层(或其他层)向视图提供错误消息的最佳/优雅方式。

我正在使用ASP.NET MVC 5,我的项目有多个层,例如:

  • MyApp.Web
  • MyApp.Business
  • MyApp.Repository
  • MyApp.DAL

我有两种类型的“错误消息”,我想提交给IHM:

  • 异常生成的错误:记录异常并显示人性化的错误消息。

  • 商业错误:例如,一项行动需要客户至少有3张发票而他只有2张。

在另一个项目中,我就是这样做的:

控制器

[HttpPost]
public ActionResult Edit()
{
    //...
    ErrorModel errorModel = new ErrorModel();

    BusinessLayer businessLayer = new businessLayer()
    businessLayer.Edit( /* some parameters */, out errorModel)

    TempData[Error] = errorModel
}

视图

@{
    var errorModel = TempData[Error]
}

/* if error model is not null, display the error correctly */

在每一层中,我的所有方法都有一个out ErrorModel变量,填充try / catch块,或者由于业务失败而且我绝对不喜欢它。

我在Google或Stack Overflow上找到了很多答案,但都关注如何捕获错误。

*我的问题更进一步:一旦被捕获,如何以优雅的方式将错误从图层中提升到视图中?

1 个答案:

答案 0 :(得分:2)

一般的方法是在所有层中抛出异常并在顶层处理它们(表示 - 控制器动作)。异常是一种方法结果,您不需要在方法签名中指定它。传递errorModel的方法并不好,因为每个方法都应该返回它,并且每个方法都应该有try catch块。

在业务层中,您可以拥有一些从Exception类派生的业务异常,并具有一些其他信息。或者您可以使用通用的ApplicationException类 所以,你的控制器看起来像

std::whatever

并且在businessLayer.Edit中,如果出现错误,则抛出异常。