C# 如果我们试图更新的资源没有受影响的行,我们是否应该抛出异常?
我正在尝试实现存储库模式。我有一个疑问,假设我们正在尝试对一个不存在的记录执行更新。在这种情况下,我们应该抛出异常吗?如果是,我们应该抛出C# 如果我们试图更新的资源没有受影响的行,我们是否应该抛出异常?,c#,oop,design-patterns,software-design,C#,Oop,Design Patterns,Software Design,我正在尝试实现存储库模式。我有一个疑问,假设我们正在尝试对一个不存在的记录执行更新。在这种情况下,我们应该抛出异常吗?如果是,我们应该抛出ArgumentException还是InvalidOperationException 如果出现ArgumentException,则输入无效。但是输入可以是有效的,并且记录仍然不存在。因此,当我们试图对一个不存在的资源执行操作时,是否应该抛出InvalidOperationException?为了回答这样一个问题,我首先尝试想象是什么导致了这种情况的发生
ArgumentException
还是InvalidOperationException
如果出现
ArgumentException
,则输入无效。但是输入可以是有效的,并且记录仍然不存在。因此,当我们试图对一个不存在的资源执行操作时,是否应该抛出InvalidOperationException
?为了回答这样一个问题,我首先尝试想象是什么导致了这种情况的发生
如果您的更新不影响任何行,则可能是以下情况之一导致的:
- 在并发系统中,该记录在发布更新时可能已经存在,但另一个并发操作在它到达数据库之前将其删除。在乐观锁定场景中,所涉及的时间范围很容易为分钟,因此这几乎不像听起来那么不可能
- 调用更新过程的程序员出错了
InvalidOperationException
。作为:
InvalidOperationException用于因无效参数以外的原因导致调用方法失败的情况。通常,当对象的状态无法支持方法调用时,会抛出该方法
一个bug确实会使调用代码调用一个不存在记录的方法,在这种情况下,您可能会认为问题在于参数,而不是系统的状态
但是,bug应该被修复。即使这样一个bug存在,一旦你解决了它,它就消失了,你将不再有无效的参数。因此,虽然并发是您必须处理的一个现实,但只要不存在bug,就不应观察无效参数。是否抛出由您决定。至于抛出哪个异常,请参见。