我不打算实现 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(支持更多框架 - 甚至更好),则不会被接受。