11

我不打算实现 Java“throws”关键字。请参阅http://www.artima.com/intv/handcuffsP.html以讨论 throws 关键字的优点以及为什么它没有在 C# 中实现。

但是,我很好奇是否有一种方法可以创建如下属性:

[ThrowsException( exceptionType = NullReferenceException )] 
[ThrowsException( exceptionType = AuthenticationException )]
public void Login( Credentials credz ) 
{
    // ... etc...
}

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

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

虽然可以使用:

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

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


更新:2013-05-23

我想出了一种通过使用属性而不使用插件来解决的方法。我将在本周末尝试解决它,如果它按预期工作,我很乐意发布解决方案。如果有人击败我发布解决方案,我会很乐意接受他们的回答。

由于我要到星期一才能解决这个问题,所以如果你能打败我,我会提供赏金 - 一个可以接受的答案是:

  • (不包括使用 Visual Studio 插件或任何第三方工具
  • && 提供一种在 XML 文档中包含异常的方法
  • && 确保在编译期间强制执行类型安全)
  • || 证明不可能满足上述三个要求才能解决此问题中提出的问题

我认为 XML 文档不反映异常是可以接受的,从 ThrowsException 属性,直到项目建成之后。

看到基于 Resharper 的解决方案会很有趣(因为它在我工作过的大多数开发商店中都很常见),但如果存在与第三方工具无关的解决方案,它将不会被接受。同样,仅在 Visual Studio 中有效的解决方案将被接受,而不是依赖于 Resharper 的解决方案,但如果存在可在其他 IDE 中有效的解决方案,例如 MonoDevelop(支持更多框架 - 甚至更好),则不会被接受。

4

3 回答 3

15

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

您正在寻找这个标签

于 2013-05-22T19:33:06.210 回答
11

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

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

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

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

于 2013-05-25T20:06:58.207 回答
1

下面应该工作

[ThrowsException( ExceptionType = typeof(NullReferenceException) )]

您的属性将具有类型的属性Type

Type ExceptionType { get; set; }
于 2013-05-22T19:32:48.043 回答