ASP.NET MVC - 在哪里抛出异常?

时间:2010-09-12 13:17:29

标签: asp.net-mvc exception

如果在db中找不到条目,​​抛出异常的最佳做法是什么?

// CONTROLLER
public ActionResult Edit(int categoryId, int id)
{
    Product target = Products.GetById(id);
    if (target == null) throw new HttpException(404, "Product not found");

    return View("Edit", target);
}

// REPOSITORY
public Product GetById(int id)
{
    return context.Products.FirstOrDefault(x => x.productId == id);
}

// CONTROLLER
public ActionResult Edit(int categoryId, int id)
{
    return View("Edit", Products.GetById(id));
}

// REPOSITORY
public Product GetById(int id)
{
    Product target = context.Products.FirstOrDefault(x => x.productId == id);
    if (target == null) throw new HttpException(404, "Product not found with given id");

    return target;
}

3 个答案:

答案 0 :(得分:24)

永远不要从存储库中抛出HttpException ......这是错误的抽象级别。如果您不希望存储库返回null,请执行以下操作:

// CONTROLLER
public ActionResult Edit(int categoryId, int id)
{
    try {
       Product target = Products.GetById(id);
    }
    catch(ProductRepositoryException e) {
       throw new HttpException(404, "Product not found")
    }

    return View("Edit", target);
}

// REPOSITORY
public Product GetById(int id)
{
    Product target = context.Products.FirstOrDefault(x => x.productId == id);
    if (target == null) throw new ProductRepositoryException();

    return target;
}

您的存储库不应该知道有关HTTP的任何信息,但您的控制器可以了解存储库。因此,您从存储库中抛出一个存储库异常,并将其“转换”为控制器中的HTTP异常。

答案 1 :(得分:3)

不要在Repository中抛出HttpException,因为您可能希望将来在非Http环境中重用该代码。如果您需要至少一个项目并在Controller中处理该异常,则抛出您自己的ItemNotFound异常,或者返回null并处理该异常。

答案 2 :(得分:-1)

我会在控制器中抛出HttpException,并从存储库返回null