如果我们尝试更新的资源没有影响任何行,我们是否应该抛出异常?
Should we throw an exception if the resource we are trying to update results in no rows affected?
我正在尝试实现存储库模式。我怀疑假设我们正在尝试对不存在的记录执行更新。在这种情况下我们应该抛出异常吗?如果是,我们应该抛出 ArgumentException
还是 InvalidOperationException
?
在 ArgumentException
的情况下,输入无效。但输入可能有效,但记录仍然不存在。那么当我们试图对不存在的资源执行操作时,我们应该抛出 InvalidOperationException
吗?
为了回答这样的问题,我首先尝试想象是什么导致了这种情况的发生。
如果您的更新不影响任何行,则可能是由以下情况之一引起的:
- 在并发系统中,当 update 发布时记录可能已经存在,但另一个并发操作在它到达数据库之前将其删除。在乐观锁定方案中,所涉及的时间范围很可能是几分钟,所以这并不像听起来那么不可能。
- 调用 update 过程的程序员出错。
在这两种情况下,我认为调用者希望了解操作失败。客户端调用具有某些 intent 的低级代码。这里的目的是更新记录。如果更新没有发生,则较低级别的代码无法执行意图。这可能会发生,但应该向调用者发回信号。虽然技术上可以忽略这种情况,但许多错误可能隐藏在这种行为的背后。
简而言之:抛出异常。
具体来说,抛出一个InvalidOperationException
。作为 the documentation states:
InvalidOperationException is used in cases when the failure to invoke a method is caused by reasons other than invalid arguments. Typically, it is thrown when the state of an object cannot support the method call.
的确,错误可能会使调用代码使用不存在的记录调用方法,在这种情况下,您可以争辩说问题在于参数,而不是系统状态。
但是,应该修复错误。即使存在这样的错误,一旦您解决了它,它就消失了,您将不会再有无效参数。因此,虽然并发是您必须处理的现实,但只要不存在错误,就不应观察到无效参数。
我正在尝试实现存储库模式。我怀疑假设我们正在尝试对不存在的记录执行更新。在这种情况下我们应该抛出异常吗?如果是,我们应该抛出 ArgumentException
还是 InvalidOperationException
?
在 ArgumentException
的情况下,输入无效。但输入可能有效,但记录仍然不存在。那么当我们试图对不存在的资源执行操作时,我们应该抛出 InvalidOperationException
吗?
为了回答这样的问题,我首先尝试想象是什么导致了这种情况的发生。
如果您的更新不影响任何行,则可能是由以下情况之一引起的:
- 在并发系统中,当 update 发布时记录可能已经存在,但另一个并发操作在它到达数据库之前将其删除。在乐观锁定方案中,所涉及的时间范围很可能是几分钟,所以这并不像听起来那么不可能。
- 调用 update 过程的程序员出错。
在这两种情况下,我认为调用者希望了解操作失败。客户端调用具有某些 intent 的低级代码。这里的目的是更新记录。如果更新没有发生,则较低级别的代码无法执行意图。这可能会发生,但应该向调用者发回信号。虽然技术上可以忽略这种情况,但许多错误可能隐藏在这种行为的背后。
简而言之:抛出异常。
具体来说,抛出一个InvalidOperationException
。作为 the documentation states:
InvalidOperationException is used in cases when the failure to invoke a method is caused by reasons other than invalid arguments. Typically, it is thrown when the state of an object cannot support the method call.
的确,错误可能会使调用代码使用不存在的记录调用方法,在这种情况下,您可以争辩说问题在于参数,而不是系统状态。
但是,应该修复错误。即使存在这样的错误,一旦您解决了它,它就消失了,您将不会再有无效参数。因此,虽然并发是您必须处理的现实,但只要不存在错误,就不应观察到无效参数。