C#/ .NET中方法的自动文档异常

Sar*_*els 31 c# documentation exception xml-documentation

我想要一些工具,最好是一个插入VS 2008/2010的工具,它将通过我的方法并添加关于它们可能抛出的异常的XML注释.我不希望<summary>为我生成或其他XML标记,因为我将自己填写,但如果即使在private/ protected方法我可以看到可以抛出哪些异常也会很好.否则,我发现自己经历了这些方法并将其悬停在其中的所有方法调用中以查看异常列表,然后更新该方法的<exception列表以包含这些.也许一个VS宏可以做到这一点?

由此:

private static string getConfigFilePath()
{
    return Path.Combine(Environment.CurrentDirectory, CONFIG_FILE);
}
Run Code Online (Sandbox Code Playgroud)

对此:

/// <exception cref="System.ArgumentException"/>
/// <exception cref="System.ArgumentNullException"/>
/// <exception cref="System.IO.IOException"/>
/// <exception cref="System.IO.DirectoryNotFoundException"/>
/// <exception cref="System.Security.SecurityException"/>
private static string getConfigFilePath()
{
    return Path.Combine(Environment.CurrentDirectory, CONFIG_FILE);
}
Run Code Online (Sandbox Code Playgroud)

更新: 看起来工具必须递归地遍历这些方法,例如,method1调用method2,它调用method3,记录为throw NullReferenceException,因此method2和method1都被工具记录为throw NullReferenceException.该工具还需要消除重复,如果方法中的两个调用被记录为抛出DirectoryNotFoundException,该方法将只列出<exception cref="System.IO.DirectoryNotFoundException"/>一次.

Ada*_*son 9

长期和简短的答案是,这是不可能的.与Java不同,.NET语言都不要求函数报告可抛出的可能异常的列表(这意味着您必须捕获或报告可能在它调用的函数上抛出的任何异常).因此,没有通用的方法来确定函数可以抛出的每个异常的详尽列表(我在这里使用单词function来覆盖任何像函数一样编写的函数,包括运算符,构造函数等),因为你有无法保证给定函数可能调用的异常.

如果您愿意使用有限的内容,那么可以想象您可以编写一些可以扫描MSDN以获取给定.NET库调用的相应文章的内容,并使用其中的异常列表(如果有)以递归方式建立列表什么可能被抛出.这不,但是,包括任何第三方库或赶上运行时抛出的异常(OutOfMemoryException,StackOverflowException,NullReferenceException[除非你想利用它更进了一步,有你的例外分析还确定是否存在空引用的任何可能性,但是,这似乎也不可能完全通用的意义]).

我很确定C#团队已经花了一两次时间(如果Eric Lippert还没有回答过关于这个的问题,我会感到惊讶),但我很确定它已经归结为对此:虽然这种系统对某些人来说是有用且有价值的,但强制使用它(并强迫你要么报告或捕获所有可能抛出的异常)导致了很多try { ... } catch (Exception ex) { ... }块,以避免内务管理,一揽子,无声捕获比未报告的异常更糟糕(恕我直言).

  • 仅在注释上递归检查的问题是你不知道top方法catch()es的异常.因此,如果A调用B,并且B可以抛出各种异常,那么您不知道这些是否会冒泡,或者它们是否被捕获.在不知道确切的底层代码的情况下,任何类型的静态分析都是无用的.所以,如果你这样做,不要费心去寻找; 你必须相信方法A()将正确记录它可以抛出的所有可能的异常. (2认同)
  • 一个不是简单地递归检查方法注释.他们的黑色XML不仅仅是`catch`块.那里有邪恶,没有睡觉. (2认同)