14

我正在用注释装饰我的C#代码,以便可以生成HTML帮助文件。记录接口及其实现

我经常声明和文档接口。但是实现这些接口的类可以根据实现情况抛出特定的异常。

有时,客户端只知道他使用的接口。我是否应该通过添加可能由其实现者抛出的异常来记录我的接口?

我应该创建/记录自定义异常,以便接口实现者抛出这些而不是框架的那些?

我希望这是明确的!

感谢

编辑2010年1月4日:我决定在http://blog.mikecouturier.com/2010/01/creating-custom-exceptions-in-net-right.html

+0

您可以自己回答问题 – Jodrell

回答

14

写博客张贴关于这一点,自定义异常在.NET我不知道我完全理解你的问题(我就是一个Java,而不是C#开发人员),但似乎你问的是什么本质上是一个多态性问题:如果有人在声明为抛出X和Y的接口上使用方法,如果实现抛出Z,会发生什么?

要遵循的一件事是一致性原则,基本上说,一个子类型应符合超类型的行为。也就是说,如果你记录你的接口中的方法只能抛出一种类型的异常(例如空指针异常),那么你与调用者的合同就是这是他们唯一应该注意的事情。如果你抛出别的东西,你可能会惊讶他们。

记录超类型中特定子类型的东西不是一个好主意,因为它会产生不必要的耦合。我会更关心这样一个事实,即实现的行为可能与声明不同,因为这可能表明声明没有足够的充实。

试着想想你的方法可能抛出的所有异常类型。为它们创建超类型,然后在你的接口方法中显式声明(例如,这个方法可以抛出一些“计算异常”)。然后,在你的实现中,抛出一个具有更多细节的计算异常,或者抛出一些特定于实现的计算异常的子类型,你仍然会遵守。

+0

好的答案。正是我要说的。 –

+0

伟大你钉了它。我将创建自定义异常,以便子类型会抛出它们。我将使事情足够普遍,以便如果子类型无法读取XML或JSON中的响应(取决于实现),则它们将能够抛出一个ParseException例如(而不是前者的XmlException)。谢谢! –

6

我同意一切Uri说 - 你应该在合理的地方创建自定义的异常,如果需要的话可以扩展,然后一个使用类型化到你的接口的参数的方法可以捕获异常,它也会捕获子类异常。

不要创建它们不必要不过,如果有一个描述错误条件使用该

在记录实施者可以使用注释的备注部分的条款(假设你”现有的.Net框架例外重新使用XML注释)来描述事情,比如你期望实现者如何去做。显然这不是强制执行的,但它可以作为开发人员使用API​​时的有用指南

+0

是的,我试图涵盖实现者应该在备注部分查找的所有内容!您也尽可能地尝试使用现有的例外。感谢您的帮助 –

+0

也+1添加详细信息 –

+3

我同意罗布。我也会说,根据我的经验,太多的异常子类型实际上并不多。大多数人会喜欢用更有意义的状态数据初始化的异常对象,即使是更好的错误消息。如果我想澄清我期望某人从某些错误中恢复,我使用键入的例外。 – Uri