我开始使用.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
}
答案 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));