.net 异常设计InvalidParentException和ObjectAlreadyPresentException

.net 异常设计InvalidParentException和ObjectAlreadyPresentException,.net,.net,我正在设计一个框架库,它可以用来存储一组分层链接的对象。我需要决定可以通过以下方法引发哪些异常: class StoreSession { StoreLeaf(leaf, parent) } 当用户调用StoreLeaf()传递参数时,如果该叶未根据我执行的某些自定义规则按层次结构链接到父级,则我需要抛出异常(类似于InvalidParentException) 如果我试图存储的对象在存储库中已经有一个条目,那么我还需要抛出一个异常(类似于ObjectAlreadyPresentExcep

我正在设计一个框架库,它可以用来存储一组分层链接的对象。我需要决定可以通过以下方法引发哪些异常:

class StoreSession {
  StoreLeaf(leaf, parent)
}
当用户调用
StoreLeaf()
传递参数时,如果该叶未根据我执行的某些自定义规则按层次结构链接到父级,则我需要抛出异常(类似于
InvalidParentException

如果我试图存储的对象在存储库中已经有一个条目,那么我还需要抛出一个异常(类似于
ObjectAlreadyPresentException

我提到了,而且,没有描述这两种场景的任何异常实例


是否存在描述这些错误情况的.NET异常?或者,即使我必须创建一个新的
异常
类型,是否有任何特定的.NET异常可以从中派生?

不,没有任何特定的.NET
异常
可以描述这些条件;如果有的话,它们可能特定于适合您需要的数据结构,您将使用它而不是编写自己的数据结构

这就是说,当框架第一次出现时,最初的建议是从中得出的,但是,很快就发现,它会导致相当多的膨胀,并且是无效的,因此当前的做法是

但是,在您的特定情况下,除非您计划在这些异常情况下采取行动,否则您可能只需要使用


如果你要对这些异常执行一个动作,那么你可能想考虑是否应该使用异常;基于异常的业务逻辑通常是不好的做法;您应该尽可能使用返回代码/值。

这听起来不像是一个应该捕获的异常。因为它代表客户端代码中的错误,所以catch处理程序无法重写代码。因此,为它们创建专用的异常类型没有什么意义,如果要捕获和处理异常,就必须这样做


带有良好异常消息的InvalidOperationException很好。

在缺乏此类指南的情况下,我倾向于尝试在BCL中找到一种尽可能类似的方法。例如,IDictionary实现是,而Dictionary实际上就是这样做的。在没有任何证据表明BCL作者对本案中抛出ArgumentException的决定感到遗憾的情况下(如注释FDG中的评论),为了与现有BCL机制保持一致,我倾向于重复使用他们的方法