如何明确地记录一个方法不会抛出异常。

9

使用C#中的XML注释,我可以记录一个方法可能会抛出异常:

<exception cref="FooException">Thrown if foo is invalid.</exception>

然而,如果方法的XML文档中没有exception标签,这可能意味着以下两种情况之一:
  1. 作者已经彻底测试了该方法,并确保它不会抛出异常,因此没有添加exception标签来记录这个事实。
  2. 作者并不关心记录异常,所以该方法可能会抛出任何异常。
根据我的经验,第二种情况通常是存在的。那么问题来了: 我该如何明确说明一个方法永远不会引发异常? 目前我想到的最好的方法就是在方法的summary中简单地提到它,例如“这个方法不会引发异常”。但我想知道是否有更正式的方式来表达这个意思,例如C ++中的throw()(尽管这可能是一个坏例子)。

10
保证一个方法不会抛出任何异常非常困难 - 考虑到OutOfMemoryExceptionThreadAbortException。我想你能做的最好的事情就是在<remarks>部分提到该方法通常不应该抛出异常。 - Matthew Watson
1个回答

2

在总结中添加内容有利于文档记录和与其他开发人员的沟通。

你说你想要一种更正式的方式。

根据我的了解,C#(我的了解非常少)中Exception 有两个主要的子类,ApplicationExceptionSystemException。通常情况下无法保证不会抛出系统异常。但我们可以保证永远不会抛出ApplicationException

1.使用契约

通过代码契约,您可以使用 EnsuresOnThrow 后置条件:

    Contract.EnsuresOnThrow<ApplicationException>( false );

2. 没有合同

将代码主体包裹在全局的try/catch中,在catch块中断言False

在两种情况下,静态分析器应该理解当异常发生时,断言或后置条件永远不能为真:因此,只有当函数从未抛出异常时,应用程序才能满足其合同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接