15

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

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

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

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

我希望这很清楚!

谢谢

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

4

2 回答 2

14

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

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

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

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

于 2009-11-28T22:07:12.423 回答
6

我同意 Uri 所说的一切 - 您应该在明智的情况下创建自定义异常,如果需要,可以扩展该异常,然后使用类型化到您的接口的参数的方法可以捕获该异常,并且它也将捕获子类型化异常。

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

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

于 2009-11-28T22:30:24.170 回答