2011-10-12 56 views
5

我想知道是否有一种工具可以在C#中使用静态代码分析来查找未捕获的异常?基本上我想选择一个methodA()并且想要methodA()所抛出的所有异常以及methodA()所调用的所有方法的列表。我试过ReSharper + Agent JohnsonAtomineerUtils,都没有通过这个简单的任务。在C#代码中查找未捕获的异常

这里是我的示例代码:

public class Rectangle 
{ 
    public int Width { get; set; } 
    public int Height { get; set; } 

    public int Area() 
    { 
     CheckProperties(); 
     long x = Width * Height; 
     if (x > 10) 
      throw new ArgumentOutOfRangeException(); 
     return (int) x; 
    } 

    private void CheckProperties() 
    { 
     if (Width < 0 || Height < 0) 
      throw new InvalidOperationException(); 
    } 
} 

该工具应该能够告诉我(任何形式),该方法面积()将抛出ArgumentOutOfRangeExceptionInvalidOperationException.

+3

我看到你想要什么,在哪里,你试图去,但尽管如此,考虑到在很多情况下,它是确定从代码抛出异常,但事实是,每次你从实际的消费类中使用这些方法时,你都应该赶上那里,这可能是百分之百的罚款区域抛出的东西,并不需要在那里捕捉,但谁叫Rectangle.Area应该... –

+0

@Davide Piras:我明白你的观点并且同意你的看法,但是考虑到你正在使用一个带有非常糟糕文档的大型第三方库 - 发现未被捕获的(或者让我们称它们为“可能抛出的”)异常会真正简化调试和开发。 – Korexio

回答

6

我使用的R#插件一次那是在IDE中做的 - 非常好。糟糕的想法,结果是它抱怨每一个字符串。格式调用和类似的常见情况,可能确实会抛出,但这不会导致问题。

自己决定,如果它是值得的:https://github.com/CSharpAnalyzers/ExceptionalReSharper

+0

当我使用一个简单的程序“Console.WriteLine(new Rectangle()。Area());”与上面给出的类,异常只会给我一个错误的Console.WriteLine(...)(System.IO.IOException未捕获),但不是对Area()的调用......另一种方法将是有用的,但这种方式根本没有任何改进... – Korexio

+1

没关系,发现问题:我没有修复Area()方法中的问题 - 所以Exceptional忽略了调用。向Area()添加文档会导致Main(...)中出现警告。 – Korexio

+0

如果没有上述问题(http://exceptionalplugin.codeplex.com/workitem/9632)Exceptional看起来像一个有用的工具。欢迎其他工具建议! – Korexio