如果在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;
}
答案 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
。