记录接口及其实现

Mik*_*ier 14 c# documentation sandcastle interface documentation-generation

我正在用注释装饰我的C#代码,所以我可以生成HTML帮助文件.

我经常声明和记录接口.但是实现这些接口的类可以根据实现抛出特定的异常.

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

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

我希望这很清楚!

谢谢

编辑2010年1月4日:我决定在http://blog.mikecouturier.com/2010/01/creating-custom-exceptions-in-net-right.html上写一篇关于.NET和自定义异常的博客文章

Uri*_*Uri 14

我不确定我完全理解你的问题(我是一个Java,而不是C#开发人员),但似乎你问的是什么本质上是一个多态的问题:如果有人在声明抛出的接口上使用一个方法X和Y,如果实现抛出Z会发生什么?

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

在超类型中记录关于特定子类型的事情并不是一个好主意,因为它会创建不必要的耦合.我会更关注一个实现可能与声明的行为不同的事实,因为这可能表明声明没有充分充实.

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


Rob*_*obV 6

我同意Uri所说的一切 - 你应该在合理的地方创建可以扩展的自定义异常,如果需要,那么使用键入你的接口的参数的方法可以捕获该异常并且它也将捕获子类型异常.

但是,如果存在描述您的错误条件的现有.Net Framework异常,请不要不必要地创建它们

在为实现者编写文档方面,您可以使用注释的备注部分(假设您正在使用XML注释)来描述诸如您希望实现者执行操作的方式.显然,这绝不是可执行的,但当开发人员使用您的API时,它可以作为有用的指导

  • 我同意罗布.我也会说,根据我的经验,太多的异常子类型并没有真正增加太多.大多数人更喜欢使用更有意义的状态数据初始化的异常对象,甚至是更好的错误消息.如果我想澄清我希望有人从某些错误中恢复,我会使用类型异常. (3认同)