问题
I've started using the .Net Complier Platform (Roslyn) to assist with enforcing coding standards.
One issue I'm struggling with is discovering and catching useless try...catch
blocks.
For example:
// Would like to have this detected and offer to remove the try...catch
try
{
// Do some work
}
catch(Exception ex)
{
throw ex;
}
It would be good to also detect the fact that the code is using throw ex;
rather than just throw;
such as:
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:
It sort of depends on what you consider a "useless try-catch". I've assumed you mean catch statements that do no other work except throwing the exception.
Given a C# syntax tree with the code you've provided, you might want to find all the syntax nodes of type CatchClauseSyntax
.
You could then look within each for StatementSyntax
that is not of type ThrowStatementSyntax
. If there are any statements that are not throw, we assume real work is being done here.
For example:
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));
来源:https://stackoverflow.com/questions/24257437/how-do-i-detect-and-correct-usless-try-catch-blocks