用于通知方法调用者该方法抛出的异常类型类型的属性

Jor*_*dan 11 c# exception custom-attributes

我不打算实现Java"throws"关键字.有关throws关键字的优点及其未在C#中实现的原因的讨论,请参见http://www.artima.com/intv/handcuffsP.html.

但是,如果有办法创建如下所示的属性,我很好奇:

[ThrowsException( exceptionType = NullReferenceException )] 
[ThrowsException( exceptionType = AuthenticationException )]
public void Login( Credentials credz ) 
{
    // ... etc...
}
Run Code Online (Sandbox Code Playgroud)

这样 - 当调用一个用一个或多个ThrowsException属性修饰的方法时,所述方法抛出的异常类型(至少是由ThrowsException属性显式声明的异常)将在方法的文档中可见

这与Java"throws"关键字不同,因为它不需要调用者处理这些异常.这样做可能会引入重大更改,例如,在不处理版本更改引入的新异常的客户端应用程序中.

虽然可以使用:

/// <exception cref="member">description</exception>
Run Code Online (Sandbox Code Playgroud)

我使用属性的意图是,如果异常的名称已更改或异常不再存在,则项目不会编译.因此,如何记录引发异常,不是同一个问题.


更新:2013-05-23

我已经想出了一种通过使用属性而不使用插件来解决问题的方法.我将在本周末尝试解决这个问题,如果能按预期工作,我将很乐意发布解决方案.如果有人打我发布解决方案,我很乐意接受他们的回答.

因为直到星期一我都无法解决这个问题,如果你能打败我,我会提供赏金 - 一个可以接受的答案是:

  • (不包括使用visual studio插件或任何第三方工具
  • &&提供了一种在XML文档中包含异常的方法
  • &&确保在编译期间强制执行类型安全性)
  • || 证明不可能满足前面三个要求,以便解决这个问题中提出的问题

我认为XML文档不能从ThrowsException属性反映异常,直到项目构建完成之后.

看到一个基于Resharper的解决方案(因为它在我工作的大多数开发工厂中都很常见)会很有趣,但是如果有一个解决方案仍然与第三方工具无关,那么它将不被接受.类似地,只能在Visual Studio中使用的解决方案可以通过依赖于Resharper的解决方案来接受,但如果有一个解决方案可以在其他IDE中工作,例如MonoDevelop(支持更多框架 - 甚至更好),则不会接受它.

Ren*_*nan 15

在C#中,您使用XML文档来记录类及其成员.在Visual Studio中,开始在某些内容上键入斜杠,并通过第三个斜杠,它将自动生成最常用的标记供您填写.它看起来有点像Javadoc和JSDoc.

具体来说,您正在寻找此标签.


Sti*_*ipo 10

我使用属性的意图是,如果异常的名称已更改或异常不再存在,则项目不会编译.因此,如何记录引发异常,不是同一个问题.

您可以在不使用属性的情况下执行此操作,而是编写<exception>文档并像这样配置项目:

Project properties -> 'Build' tab:
'Output' section: Check 'XML documentation file'.
'Treat warnings as erros' section: Check 'Specific warnings' and add warning 1574.
Run Code Online (Sandbox Code Playgroud)

这样,如果cref无法解析XML文档属性值,项目将无法编译.

  • @Martin [...从上一步继续]为防止从代码中意外创建对此程序集的引用,请在Visual Studio Properties窗格中设置`Aliases`字段,以引用类似`mvc`的引用.在需要在文档中引用此程序集的特定文件中,将`extern alias mvc;`添加到文件的顶部,然后使用`<see cref ="mvc :: System.Web.Mvc.Html将文档引用到引用. ChildActionExtensions.RenderAction(mvc :: System.Web.Mvc.HtmlHelper,string)"/>`. (2认同)