Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 记录接口及其实现_C#_Documentation_Interface_Documentation Generation_Sandcastle - Fatal编程技术网

C# 记录接口及其实现

C# 记录接口及其实现,c#,documentation,interface,documentation-generation,sandcastle,C#,Documentation,Interface,Documentation Generation,Sandcastle,我正在用注释装饰我的C代码,以便生成HTML帮助文件 我经常声明和文档接口。但是实现这些接口的类可以根据实现抛出特定的异常 有时,客户机只知道他正在使用的接口。我是否应该通过添加其实现者可能引发的异常来记录接口 我是否应该创建/记录自定义异常,以便接口实现者抛出这些异常,而不是框架的异常 我希望这是清楚的 谢谢 编辑2010年1月4日:我决定在上写一篇关于这一点和.NET中自定义异常的博客文章,我不确定我是否完全理解了你的问题(我是Java,不是C#开发人员),但你似乎在问什么本质上是多态性问题

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

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

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

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

我希望这是清楚的

谢谢


编辑2010年1月4日:我决定在

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

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

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


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

我同意Uri所说的一切-您应该在需要时创建可以扩展的自定义异常,然后使用为接口键入的参数的方法可以捕获该异常,它也将捕获子类型的异常

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


在为实现者编写文档方面,您可以使用注释的备注部分(假设您使用的是XML注释)来描述一些事情,比如您希望实现者如何做事情。显然,这是不可强制执行的,但当开发人员开始使用API时,它可以作为有用的指导方针。正是我要说的。太好了,你搞定了。我将创建自定义异常,以便子类型抛出它们。我将使事情变得足够一般,这样,如果子类型不能读取XML或JSON(取决于实现)中的响应,它们将能够抛出ParseException(例如,对于前者,不是XmlException)。谢谢是的,我试图在备注部分介绍实现者应该查找的所有内容!您尝试尽可能多地使用现有的异常也是正确的。谢谢你的帮助。另外,我同意Rob的观点。我还想说,根据我的经验,太多的异常子类型并不能真正增加太多。大多数人更喜欢使用更有意义的状态数据初始化异常对象,甚至是更好的错误消息。如果我想澄清我希望有人能从某些错误中恢复过来,我就使用类型化异常。你是说我只能有一个自定义异常,但有一个成员变量可以深入解释发生了什么?像
抛出新的MyLibraryException(eReason.ParseError)其中eRason是可能发生的多个事件的枚举?(也可以是你说的字符串)。很好。你需要一个很好的理由来创建一个新的异常类。除非您希望有人能够真正捕获它,否则添加您自己的异常类(而不是使用InvalidOperationException、ArgumentException等)只会降低代码的可溶解度