5

我有一个三层的 Web 应用程序:Web > Services > Core。服务有一堆帮助 Web 构建和解释视图模型的业务逻辑。有时服务层可能会出现问题,用户应该被推送到错误页面。

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

那个 isNull 块会发生什么?

4

3 回答 3

6

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

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

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

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

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

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

您可以在此处找到 MVC 控制器异常处理的一个很好的概述。

于 2013-02-20T03:26:26.790 回答
2

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

在您展示的具体示例中,OrderNotFoundException 就可以了。

于 2013-02-20T03:29:28.587 回答
0

如果服务层是在 WCF 上构建的,则使用故障契约来传达错误/异常信息。

于 2013-02-20T07:34:37.813 回答