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

Dan*_*olf 9 c# exception xml-comments code-documentation

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

<exception cref="FooException">Thrown if foo is invalid.</exception>
Run Code Online (Sandbox Code Playgroud)

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

  1. 作者彻底测试了该方法,确保它永远不会抛出异常,并希望通过不添加exception标记来记录这一事实.
  2. 作者并不关心记录异常,因此这种方法可能会抛出任何东西.

根据我的经验,第二种情况通常就是这样.那么问题是:

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

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

cor*_*ump 2

在摘要中添加它有利于文档记录以及与其他开发人员的沟通。

你说你想要一个更正式的方式,强硬。据我所知,C#(非常少)Exception有两个主要的子类,ApplicationException并且SystemException. 您通常不能保证不会抛出系统异常。然而,我们可以保证不会ApplicationException抛出任何异常。

1.有合同

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

    Contract.EnsuresOnThrow<ApplicationException>( false );
Run Code Online (Sandbox Code Playgroud)

2. 无合同

将代码主体包装在 global 中try/catch,并False在 catch 块中断言。

在这两种情况下,静态分析器应该明白,当异常发生时,断言或后置条件永远不会为真:因此,当且仅当函数没有抛出异常时,应用程序才会履行其契约。