httpconfiguration - ASP.NET MVC-¿Dónde lanzar las excepciones?
httpconfiguration.net core (3)
¿Mejores prácticas para lanzar la excepción si no se encuentra ninguna entrada en la base de datos?
// 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);
}
o
// 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;
}
No lance una HttpException en el Repositorio, ya que puede querer reutilizar ese código en el futuro en un entorno que no sea Http. Lance su propia excepción de ItemNotFound si necesita al menos un artículo y maneja esa excepción en el Controlador, o devuelva el valor nulo y maneje eso.
Nunca lance una HttpException
desde un repositorio ... es el nivel incorrecto de abstracción. Si no desea que su repositorio devuelva null
, haga algo como esto:
// 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;
}
Su repositorio no debe saber nada acerca de HTTP, pero su controlador puede saber sobre el repositorio. Así que lanza una excepción de repositorio desde el repositorio, y "traduce" eso a una excepción de HTTP en el controlador.
HttpException
en el controlador y devolvería el null
desde el repositorio.