如何显式地记录方法不会抛出异常

时间:2014-03-26 08:44:21

标签: c# exception xml-comments code-documentation

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

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

但是,如果某个方法的XML文档中没有exception标记,这可能意味着以下两种情况之一:

  1. 作者彻底测试了该方法,确保它永远不会抛出异常,并希望通过不添加exception标记来记录这一事实。
  2. 作者并不关心记录异常,所以这种方法可能会抛出任何东西。
  3. 根据我的经验,第二种情况通常就是这样。问题是,那么:

    如何明确记录方法永远不会抛出异常?

    到目前为止,我提出的最好的方法是在方法的summary中简单地提及它,就像“此方法不会抛出异常”。但我想知道是否有更正式的表达方式,比如C ++中的throw()(即使这可能是一个不好的例子)。

1 个答案:

答案 0 :(得分:2)

在摘要中添加它有助于文档和与其他开发人员的沟通。

你说你想要一个更正式的方式,艰难。 根据我所知的C#(非常少),Exception有两个主要的子类,ApplicationExceptionSystemException。您通常无法保证不会抛出系统异常。但是,我们可以保证不会抛出ApplicationException

1。合同

使用code contracts,您可以使用EnsuresOnThrow后置条件:

    Contract.EnsuresOnThrow<ApplicationException>( false );

2。没有合同

将代码正文包装在全局try/catch中,并在catch块中声明False

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