Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果我们试图更新的资源没有受影响的行,我们是否应该抛出异常?_C#_Oop_Design Patterns_Software Design - Fatal编程技术网

C# 如果我们试图更新的资源没有受影响的行,我们是否应该抛出异常?

C# 如果我们试图更新的资源没有受影响的行,我们是否应该抛出异常?,c#,oop,design-patterns,software-design,C#,Oop,Design Patterns,Software Design,我正在尝试实现存储库模式。我有一个疑问,假设我们正在尝试对一个不存在的记录执行更新。在这种情况下,我们应该抛出异常吗?如果是,我们应该抛出ArgumentException还是InvalidOperationException 如果出现ArgumentException,则输入无效。但是输入可以是有效的,并且记录仍然不存在。因此,当我们试图对一个不存在的资源执行操作时,是否应该抛出InvalidOperationException?为了回答这样一个问题,我首先尝试想象是什么导致了这种情况的发生

我正在尝试实现存储库模式。我有一个疑问,假设我们正在尝试对一个不存在的记录执行更新。在这种情况下,我们应该抛出异常吗?如果是,我们应该抛出
ArgumentException
还是
InvalidOperationException


如果出现
ArgumentException
,则输入无效。但是输入可以是有效的,并且记录仍然不存在。因此,当我们试图对一个不存在的资源执行操作时,是否应该抛出
InvalidOperationException

为了回答这样一个问题,我首先尝试想象是什么导致了这种情况的发生

如果您的更新不影响任何行,则可能是以下情况之一导致的:

  • 在并发系统中,该记录在发布更新时可能已经存在,但另一个并发操作在它到达数据库之前将其删除。在乐观锁定场景中,所涉及的时间范围很容易为分钟,因此这几乎不像听起来那么不可能
  • 调用更新过程的程序员出错了
在这两种情况下,我认为调用方希望了解操作失败。客户机出于某种目的调用较低级别的代码。这里的目的是更新记录。如果没有进行更新,则较低级别的代码无法执行该意图。这可能会发生,但应该用信号通知调用者。虽然在技术上可以忽略这种情况,但许多bug可能隐藏在这种行为背后

简而言之:抛出一个异常

具体来说,抛出一个
InvalidOperationException
。作为:

InvalidOperationException用于因无效参数以外的原因导致调用方法失败的情况。通常,当对象的状态无法支持方法调用时,会抛出该方法

一个bug确实会使调用代码调用一个不存在记录的方法,在这种情况下,您可能会认为问题在于参数,而不是系统的状态


但是,bug应该被修复。即使这样一个bug存在,一旦你解决了它,它就消失了,你将不再有无效的参数。因此,虽然并发是您必须处理的一个现实,但只要不存在bug,就不应观察无效参数。

是否抛出由您决定。至于抛出哪个异常,请参见。