在c#中自动查看哪些函数可能返回exception的方法

没有什么比看到你的代码在调试器中崩溃的方法更令人沮丧,因为exception的方法并没有尝试/捕获它。

是否有一种简单的方法来扫描您的源并标记所有可能引发exception的函数?

视觉辅助中的构建是否有一些隐藏选项可以将这些function着色为特定颜色?

谢谢

[R

我认为redgate有一个工具用于这个“exception猎人”他们在审判后收取费用。

http://www.red-gate.com/products/Exception_Hunter/index.htm

所有代码,但最琐碎的可能会抛出exception(内存不足,至少)。 你可能最好在防御性地编写代码,至少使用全局try / catch而不是试图微观管理哪些代码段将会或不会抛出exception。

不,没有办法自动执行此操作,也没有一种方法可以获取方法抛出的所有可能exception的列表。 以下是几个原因

  1. 考虑隐式抛出的exception,例如StackOverflowException,可以随时从任何方法抛出。 您必须假设CLR中的任何方法都可以抛出这些类型的exception
  2. reflection和/或委托可以隐藏在特定方法中调用的实际代码,因此您无法检查方法的所有可能代码路径。
  3. 这需要检查IL与元数据。
  4. 在.Net中,不需要记录API明确抛出的exception

正如其他人所说,我不确定你是否会在C#中找到一种万无一失的方法,因为它不支持检查exception。

稍微提醒一下,这让我想起了Anders Hejlsberg对“ Checked Exceptions的麻烦 ”的采访。 我不是试图对exception进行火焰检查,而是建议您阅读Ander在C#exception设计背后的理由以及处理exception的建议方法:集中式exception处理。

我认为resharper会为您提供exception提示。 但是由于C#不支持检查exception的原因,有办法确定exception。 也许像NDepend这样的代码分析工具支持这一点。

一切都可以抛出exception。 检查MSDN以获取方法可以抛出的exception列表。

所有非空方法都可以以某种forms抛出exception。 如果您担心自己生成的exception,可以通过XML文档以与框架方法相同的方式从intellisense中显示它们,如下所示:

///  /// I seem to have written a method to do a thing. ///  /// An unfortunate failure. public void DoSomething() { /* ... */ } 

任何代码都可能导致exception,尝试和预测这是您的工作!

有许多第三方工具可以帮助找到一些常见错误,例如fxcop和重构等工具可以提出建议。

目前已经完成了一些工作,可以帮助您找到潜在的例外情况。 看一下PEX,它可以帮助您为您的function生成测试:research.microsoft.com/en-us/projects/Pex/(链接似乎在发布时失效)

另一个令人兴奋的领域是代码合同(来自.net 4 /可用作规范#)。 代码契约允许您编写指定必须满足的条件的语句。 这些可以在调用函数之前和之后,也可以声明不变量。 条件可能像值一样简单!= null。 然后在编译和运行时分析这些条件,以检查没有违反它们的代码路径。

正如其他人所说,你应该假设每一行代码都会抛出exception,除非你已经certificate它不能。 更好的问题是,“你打算怎么办?”

一般来说,你根本不应该抓住任何例外。

当然,其他一切都是该规则的例外。 捕获exception以记录它是有意义的(如果您的环境不像ASP.NET那样为您执行此操作)。 捕获exception是有意义的,以便将其替换为提供有关上下文的更多详细信息的另一个exception:

 public int GetConfiguredInteger(string name) { string s = null; try { s = GetStringFromConfigFile(name); } catch (IOException ex) { throw new Exception(String.Format( "Error in configuration file foo.config when processing {0}", name), ex); } return int.Parse(s); } 

如果你没有告诉他们,调用者不可能知道IOException是由配置文件引起的。 另请注意我如何忽略与文件I / O无关的所有exception。 特别要注意,int.Parse甚至不在try / catch块中。

还有少数其他此类exception,但捕获exception的基本思想是:不要这样做,除非如果不这样做会更糟。

Exception Finder中有一个reflection器添加,它将显示方法可以抛出的exception。 我没有使用它,但在.Net用户组会议上看到了它的一个例子。

有一个工具可以做到这一点。 您可以下载试用版,看看是否喜欢它。 我真的不认为这是必要的,但如果你为一家公司工作并且他们会付钱,你可能想要调查一下。 就像之前所说的那样,有太多可能的exception被提出。 看看Excpetion Hunter

少数人提到的例外猎人是一个很好的工具来帮助解决这个问题。 我不知道它是否与 XML-Doc注释绑定在一起,以便您可以强制执行代码抛出的exception的文档。

我发现在外部捕获区内部进行破坏并向下发现exception发生的实际点更令人沮丧。

大多数情况下,如果抛出exception并且我没想到它我发现了一个错误,如果它没有被一些无操作exception处理混淆就更容易解决它。

编辑:因为你的例子实际上是一个很好的例子我仍然不相信这样的工具会帮助你。 会有很多可能的exception,实际上每一行代码都会抛出,你很难找到“有趣”的代码。