如何检测并纠正无用的try catch块?

时间:2014-06-17 06:55:09

标签: c# compiler-construction roslyn

我开始使用.Net Complier Platform(Roslyn)协助执行编码标准。

我遇到的一个问题是发现并捕获无用的try...catch块。

例如:

// Would like to have this detected and offer to remove the try...catch
try
{
    // Do some work
}
catch(Exception ex)
{
    throw ex;
}

最好还检测到代码使用throw ex;而非throw;的事实,例如:

try
{
    // So some work
}
catch(Exception ex)
{
    // Log the error or anything to manage the exception
    throw ex;  // <-- how to detect and offer a fix for this
}

1 个答案:

答案 0 :(得分:0)

这取决于你认为是什么&#34;无用的试听&#34;。我假设你的意思是除了抛出异常之外没有其他工作的catch语句。

给定一个包含您提供的代码的C#语法树,您可能希望找到CatchClauseSyntax类型的所有语法节点。

然后,您可以查看不属于StatementSyntax类型的ThrowStatementSyntax。如果有任何未抛出的陈述,我们假设这里正在进行实际工作。

例如:

var tree = CSharpSyntaxTree.ParseText(@"
public class MyClass {
public void Method()
{
    try { }
    catch(Exception e)
    {
        //useless
        throw e;
    }
    try {  }
    catch(Exception e)
    {
        //Some work
        int aVariable = 4;
        throw e;
    }
}
}
");

//Finds all catch clauses
var catchClauses = tree.GetRoot().DescendantNodesAndSelf().OfType<CatchClauseSyntax>();
//Look at the catch blocks
var catchBlocks = catchClauses.Select(n => n.DescendantNodes().OfType<BlockSyntax>().First());
//Filter out the clauses where statements all are only throw statements
var uselessClauses = catchBlocks.Where(n => n.Statements.All(m => m is ThrowStatementSyntax));