【发布时间】:2019-07-08 14:41:40
【问题描述】:
每当存储库层抛出异常时,我应该发回什么响应,我有点困惑。
我有一个控制器,它调用一个服务,然后服务调用一个存储库来返回数据。
public class ProductController : Controller
{
[HttpGet]
public IEnumerable<Product> GetProducts()
{
return _productService.GetAllProducts();
}
}
public class ProductService: IProductService
{
public List<Product> GetAllProducts()
{
return _productRepository.GetProducts();
}
}
public class ProductRepository: IProductRepository
{
public List<Product> GetProducts()
{
try
{
//database call to get products;
}
}
catch(Exception ex)
{
log.Error("Exception occurred while calling GetProducts", ex);
return new List<Product>();
}
}
}
如果我返回新列表,如果数据库返回空数据集,则返回相同的响应,但如果发生任何异常,我想从控制器返回不同的响应。
我的想法是从存储层返回 null,然后在服务层我可以检查响应是否为 null,然后我可以向控制器返回带有空产品列表的错误消息。
或
我是否应该不处理存储层中的异常,而只检查服务层中的异常,然后在发生异常时将消息和空产品列表返回给控制器。
然后控制器可以检查是否有任何错误消息,然后返回 500 HTTP 状态代码以及消息和空列表。
我很困惑处理异常和返回错误消息的正确方法是什么。用 HTTP 状态码返回错误消息的正确方法是什么?
【问题讨论】:
-
据我记得,如果您不明确处理任何异常,则默认为 500 响应。如果我没有充分的理由不这样做,这就是我会做的。我会测试并确保生产用户不会看到堆栈跟踪或类似的东西(通常关于内部错误的信息太多)。
-
不要捕获(吞下)您无法处理的异常。记录它们,然后重新扔掉它们。如果您不想引发异常,请创建一个通用响应模型,作为存储库响应的包装器。但总的来说,让它失败,但要防止敏感数据到达最终用户。 (这通常已经为模板 mvc 应用程序设置)。此外,这可能会以主要基于意见的方式结束。也许把它放在softwareengineering.stackexchange.com
-
不返回空值。如果 null 甚至是一种可能性,那么它意味着什么,就像没有结果一样。 (一个空列表会更好。)如果您因为异常而返回 null,现在 null 可能意味着两件事。这可能意味着没有结果或例外。即使您最终以某种方式告诉用户正确的事情,任何必须阅读和调试代码的人都不应理解诸如“如果结果为空,则意味着存在异常”之类的事情。 exception 表示存在异常。
-
我认为吞下异常然后创建一个通用响应模型来返回自定义错误消息是个好主意,这将防止敏感的内部信息到达最终用户。谢谢你们。
-
@Sahil 这将是一个可怕的想法,客户端开发人员会讨厌它。 200代表成功。在声明 成功 时返回模型深处的错误代码意味着客户端代码必须读取并解析整个响应,以查看是否有 任何数据需要解析和处理.
标签: c# asp.net-mvc