3

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

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

  • 我的应用程序网站
  • MyApp.Business
  • MyApp.Repository
  • 我的应用程序.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上找到了很多答案,但都集中在如何捕捉错误上。

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

4

1 回答 1

2

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

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

    [HttpPost]
    public ActionResult Edit()
    {
        try
        {
            businessLayer.Edit( /* some parameters */)
            return Ok();
        }
         catch(BadAcctionException)
        {
            TempData[Error] = "Bad business operation";
            return BadBusinessAction();
        }
        catch(ApplicationException ex)
        {
            TempData[Error] = ex.Message;
            return Fail();
        }
    }

如果出现问题,则在 businessLayer.Edit 内部抛出异常。

于 2017-01-16T16:53:16.133 回答