gpt4 book ai didi

c# - 什么时候抛出异常

转载 作者:行者123 更新时间:2023-11-30 14:44:46 25 4
gpt4 key购买 nike

虽然我阅读了很多关于异常处理的内容,但我仍然不确定什么时候抛出异常处理,什么时候不抛出。

例如,我有一个 API 作为三层架构,并且在 DB 层中可以发生事件。

  • 尝试从数据库中接收一个客户,但是没有找到给定 ID 的客户。
  • 尝试通过 ID 删除客户,但在数据库中找不到该 ID。
  • 尝试通过 ID 更新客户,但在数据库中找不到该 ID。

在第一种情况下,我没有抛出异常,因为没有什么真正“出错”。我的存储库函数只返回“null”来告诉上层没有找到任何东西。但是另外两个案例已经很棘手了。

如果没有找到 id,deleteById 函数返回“null”对我来说没有意义。如果删除不成功,我可以返回“false”,如果删除成功,我可以返回“true”。但是然后我必须将它从数据库层传输到域层到表示层。抛出异常对我来说很容易。但在这种情况下,我也没有产生“意外行为”。与第一种情况一样,没有任何“出错”。有没有什么“最佳实践”?

你会怎么做?

最佳答案

我认为您不应该在任何这些情况下抛出异常 - 原因如下:
异常应该用于特殊的事情——主要是你无法在代码中控制的事情——比如网络连接错误和类似的事情。
正如 Eric Lipprt explains so much better than I can. 那样,在非异常情况下抛出异常只是,好吧,令人烦恼

  • Try to receive a customer from database, but customer with the given id was not found.

嗯,这很简单 - 您没有在数据库中找到客户 - 返回 null。没有理由抛出异常,因为在这种情况下没有任何异常。

  • Try to delete a customer by id, but the id was not found in database.

如果在数据库中找到客户,则此操作将导致删除该客户。
如果在数据库中没有找到它——最终结果仍然和找到它一样——那么你为什么要关心它一开始就不存在呢?同样,没有理由抛出异常。

  • Try to update a customer by id, but the id was not found in database.

这个是最难解释的,但基本上有两种合法的方法来处理这种情况:

一种方法是在更新语句具有不适合表中任何行的 where 子句时执行任何数据库执行的操作 - 这只是什么都不做。
至于让客户端知道是否有实际更新或它是空操作,您可以检查受影响的行数并向客户端返回 true/false 或 customer/null。

另一种方法是将更新转换为“upserts”——所以如果在数据库中找不到客户,只需创建一个新客户即可。
这也可以使用简单的 true/false 返回值返回给客户端。在这种情况下,您应该正确命名该方法 - 例如 AddOrUpdateCustomer

关于c# - 什么时候抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57606930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com