我正在设计一个Framework库,可用于存储分层链接的对象集。我需要决定以下方法可以抛出哪些异常:
class StoreSession {
StoreLeaf(leaf, parent)
}
当用户调用StoreLeaf()
传递params并且如果叶子没有根据我执行的某些自定义规则分层链接到父级,那么我需要抛出异常(类似于InvalidParentException
)
如果我试图存储的对象已经在存储库中有一个条目,那么我还需要抛出异常(类似于ObjectAlreadyPresentException
)
是否有描述这些错误情况的.NET异常?或者甚至如果我必须创建一个新的Exception
类型,我可以从中派生出任何特定的.NET异常吗?
答案 0 :(得分:1)
不,没有任何特定的.NET Exception
来描述这些条件;如果有的话,它们可能会特定于符合您需求的数据结构,而您将使用它而不是自己编写。
也就是说,当框架首次出现时,最初的建议是从ApplicationException
推导出来,然而,很快就发现它导致了相当多的膨胀并且无效,所以目前的做法是derive custom exceptions directly from Exception
但是,在您的具体情况下,除非您计划面对这些例外,否则您应该只使用InvalidOperationException
。
如果 要对这些例外执行操作,那么您可能想要考虑是否应该使用例外;将业务逻辑基于异常通常是不好的做法;你应该尽可能使用返回代码/值。
答案 1 :(得分:1)
这听起来不像是一个应该被抓住的例外。由于它表示客户端代码中的错误,因此catch处理程序无法重写代码。因此,为它们创建专用的异常类型没有什么意义,如果要捕获和处理异常,那么 要做的事情。
带有良好异常消息的InvalidOperationException很好。
答案 2 :(得分:0)
如果没有针对此类事情的指导原则,我倾向于尝试在BCL中找到尽可能相似的方法。例如,IDictionary实现是supposed to throw an ArgumentException for a duplicate key passed to the Add(TKey, TValue) method,这是Dictionary实际上做的。在没有任何证据表明BCL作者对在这种情况下抛出ArgumentException的决定感到遗憾的情况下(例如注释FDG中的注释),为了与现有的BCL机制保持一致,我倾向于重复使用他们的方法。 / p>