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

时间:2013-05-22 19:30:09

标签: 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...
}

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

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

虽然可以使用:

/// <exception cref="member">description</exception>

我使用属性的意图是,如果异常的名称已更改或异常不再存在,则项目不会编译。因此,How To Document Thrown Exceptions不是同一个问题。


更新:2013-05-23

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

由于我无法在星期一之前解决这个问题,如果你能打败我,我会提供赏金 - 一个可以接受的答案是:

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

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

看到一个基于Resharper的解决方案会很有意思(因为它对我工作过的大多数开发工作都很常见),但是如果有一个解决方案仍然与第三方工具无关,则不会被接受。类似地,仅依赖于Resharper的解决方案可以接受仅在Visual Studio中工作的解决方案,但是如果存在可在其他IDE中工作的解决方案,则不会接受该解决方案。 MonoDevelop(支持更多框架 - 甚至更好)。

3 个答案:

答案 0 :(得分:15)

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

您正在寻找this tag

答案 1 :(得分:9)

  

我使用属性的意图是项目不能编译   如果异常的名称已更改或异常没有   更长的存在。因此,如何记录引发异常,不是   同样的问题。

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

Project properties -> 'Build' tab:
'Output' section: Check 'XML documentation file'.
'Treat warnings as erros' section: Check 'Specific warnings' and add warning 1574.

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

答案 2 :(得分:1)

以下应该有效

[ThrowsException( ExceptionType = typeof(NullReferenceException) )]

您的属性将具有Type

类型的属性
Type ExceptionType { get; set; }