从n层ASP.Net MVC应用程序的服务层处理或引发异常的合适方法是什么?

Rob*_*ous 5 asp.net-mvc exception-handling asp.net-mvc-3 asp.net-mvc-4

我有一个包含三层的Web应用程序:Web>服务>核心。服务具有许多业务逻辑,可帮助Web构造和解释viewModel。有时,尽管Services层中可能存在问题,并且应该将用户推送到错误页面。

如何在MVC应用程序的服务层中实现错误处理?例如:

public void DeleteOrder(int orderId)
{
    var order = _db.Order.FirstOrDefault(c => c.OrderId == orderId);
    if (order == null)
    {
        // error handling
    }

    _db.Orders.Remove(order);
    _db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

那isNull块会发生什么?

Joe*_*ano 5

通常,您会将异常处理代码放入控制器中。用您的术语来说,我假设MVC控制器位于“ Web”层中,并且这些控制器调用“服务”层中的方法,例如您显示的“ DeleteOrder”方法。如果是这种情况,则在DeleteOrder的错误处理代码中,您只需抛出一个异常:

if (order == null)
{
    throw new InvalidOperationException("Specified OrderId does not exist");
}
Run Code Online (Sandbox Code Playgroud)

这样,未处理的异常将传递到您的控制器,您的异常处理代码将驻留在该控制器中,您可以在其中记录该异常并将用户重定向到相应的错误页面。

至于如何在控制器中处理异常,您有多种选择:

  1. 对每个操作方法使用try-catch块
  2. 通过实现OnException方法在您的控制器类上实现IExceptionFilter接口
  3. 使用内置的HandleErrorAttribute异常过滤器
  4. 创建自己的自定义异常处理过滤器

第四种方法(创建自己的异常过滤器)可能是最可靠的方法。在这里,您可以添加异常日志记录,以及基于抛出的异常类型将用户重定向到适当的错误页面的代码。

您可以在此处找到有关MVC控制器异常处理的完整概述。