如何检测和纠正无用的尝试捕获块
本文关键字:无用 何检测 检测 | 更新日期: 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));