如何检测和纠正无用的尝试捕获块

本文关键字:无用 何检测 检测 | 更新日期: 2023-09-27 18:09:06

我已经开始使用.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
}

如何检测和纠正无用的尝试捕获块

这有点取决于你认为的"无用的尝试捕获"。我假设你的意思是 catch 语句,除了抛出异常之外没有其他工作。

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

然后,您可以在每个中查找不属于 ThrowStatementSyntax 类型的StatementSyntax。如果有任何语句没有抛出,我们假设这里正在完成真正的工作。

例如:

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));