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

时间:2013-02-20 02:50:39

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 exception-handling

我有一个包含三层的Web应用程序:Web>服务>核心。 Services有一堆业务逻辑,可以帮助Web构建和解释viewModels。有时,服务层可能存在问题,应将用户推送到错误页面。

如何在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();
}

那会是什么?是否阻止?

3 个答案:

答案 0 :(得分:3)

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

if (order == null)
{
    throw new InvalidOperationException("Specified OrderId does not exist");
}

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

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

  1. 对每个操作方法使用try-catch块
  2. 通过实施IExceptionFilter interface方法
  3. 在您的控制器类上实施OnException
  4. 使用内置的HandleErrorAttribute exception filter
  5. 创建您自己的custom exception handling filter
  6. 第四种方法(创建自己的异常过滤器)可能是最强大的方法。在这里,您可以添加异常日志记录,以及根据抛出的异常类型将用户重定向到适当的错误页面的代码。

    您可以很好地了解MVC控制器异常处理here

答案 1 :(得分:1)

抛出用户友好的异常是要走的路。您的控制器应该尝试/捕获调用您的服务层的代码,并通过将用户重定向到适当的错误页面来采取相应的行动。

在您显示的具体示例中,OrderNotFoundException没问题。

答案 2 :(得分:0)

如果服务层是在WCF上构建的,那么使用Fault Contract来传达错误/异常信息。