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

C#/.NET中方法的自动文档异常,c#,exception,documentation,xml-documentation,C#,Exception,Documentation,Xml Documentation,我想要一些工具,最好是插入VS2008/2010的工具,它将检查我的方法并添加关于它们可能抛出的异常的XML注释。我不希望为我生成或其他XML标记,因为我将自己填写这些标记,但如果即使在私有/受保护的方法上,我也能看到哪些异常会被抛出,那就太好了。否则,我会检查这些方法,并将鼠标悬停在其中的所有方法调用上以查看异常列表,然后更新该方法的。长话短说,这是不可能的。与Java不同,没有一种.NET语言要求函数报告可能引发的异常列表(这意味着您必须捕获或报告它调用的函数上可能引发的任何异常)。因此,没

我想要一些工具,最好是插入VS2008/2010的工具,它将检查我的方法并添加关于它们可能抛出的异常的XML注释。我不希望为我生成
或其他XML标记,因为我将自己填写这些标记,但如果即使在
私有
/
受保护的
方法上,我也能看到哪些异常会被抛出,那就太好了。否则,我会检查这些方法,并将鼠标悬停在其中的所有方法调用上以查看异常列表,然后更新该方法的
。长话短说,这是不可能的。与Java不同,没有一种.NET语言要求函数报告可能引发的异常列表(这意味着您必须捕获或报告它调用的函数上可能引发的任何异常)。因此,没有通用的方法来确定函数可能抛出的每个异常的详尽列表(我在这里使用function这个词来涵盖像函数一样编写的任何内容,包括操作符、构造函数等)因为对于给定函数可能调用的内容可能引发的异常,您没有任何保证

如果您愿意使用有限的,那么您可以编写一些东西,扫描MSDN以查找给定.NET库调用的适当文章,并使用其中的异常列表(如果有)递归地建立可能抛出的内容的列表。但是,这不会覆盖任何第三方库或捕获运行时引发的任何异常(
OutOfMemoryException
StackOverflowException
NullReferenceException
[除非您想更进一步,让您的异常分析也确定是否存在空引用的可能性,但这在完全通用的意义上似乎也是不可能的])

我很确定C#团队已经讨论过一两次了(如果Eric Lippert还没有就此回答一个问题,我会感到惊讶),但我很确定,这可以归结为:虽然这种系统对某些人来说是有用的和有价值的,但它的使用是强制性的(并强制您报告或捕获所有可能抛出的异常)导致了大量
try{…}catch(Exception ex{…}
块,以避免内务处理,而笼统的静默捕获更糟糕(IMHO)而不是一个未报告的异常。

来自RedGate软件的方法可以让您达到一半。它可以对您的代码进行静态分析,并显示哪些代码行(包括.NET Framework调用)将引发哪些异常。它不会为您编写XML文档


但是,我必须说,你需要现实地认识到这样一个工具有多有用……有许多异常可能是由于非常不寻常的情况而发生的,比如
System.OutOfMemoryException
System.executionEngineeexception
,或者是由于程序员错误,比如
System.NotImpl校正异常
。从技术上讲,这些都是可能的,但实际上,尝试为每种方法记录大多数异常是不值得的……您的应用程序中几乎每种方法都会有数百行注释。

确实会分析可能异常的代码。也许您可以使用它的一些功能ity。

您可以通过使用它来实现部分需求,它支持记录异常


您还可以使用、Resharper和来生成异常。请参阅以下问题:

注意,这样的工具并非微不足道,而且永远不能保证为您提供完整的异常列表,因为a)我的代码可以动态执行,例如使用反射,或者b)异常是由运行时引发的,例如OutOfMemoryException、StackOverflowException等。这也不可能是穷尽的,因为这样的工具必须遍历所有可能的托管异常,包括BCL中的异常,并且可能知道底层com异常我很好奇你为什么要这样做。知道或不知道会抛出哪些异常对调用代码有什么影响?@Christian Hayter:这将有助于调用方了解预期的异常。例如,MSDN记录了这一点。@FrustedWithFormsDesigner:严格地说,t对于每个(本地,意味着没有服务引用).NET程序集,his都是正确的。即使是模糊的IL也可以进行分析(事实上,它可以在没有任何额外困难的情况下进行分析)用于异常处理。有没有一种方法可以动态检查方法XML注释中的异常列表?这是一种廉价、非穷举的技术,但总比没有/手动记录异常要好。@Sarah:我知道没有这样的工具,但我不明白为什么你可以写一些东西来阅读XML文档对于给定的库,您必须执行自己的静态分析和重载解析(与C#spec中的规则相匹配;称之为非琐碎将是一种严重的轻描淡写)为了将调用与文档匹配。仅对注释进行递归检查的问题是,您不知道top方法catch()会出现什么异常因此,如果A调用B,B可以抛出各种各样的异常,你不知道这些异常是否冒泡,或者是否被捕获。如果不知道确切的底层代码,任何类型的静态分析都是无用的。因此,如果你这样做,不要费心递归地查找;你必须相信方法A()将正确记录它可能引发的所有异常。我们不会简单地递归检查方法注释。它们的黑色XML不仅仅由
catch
块保护。那里有不休眠的邪恶。OP在更新部分提到了递归分析。I merel
private static string getConfigFilePath()
{
    return Path.Combine(Environment.CurrentDirectory, CONFIG_FILE);
}
/// <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);
}