是否有一些内置在函数/扩展/工具中的方法来查找VS2013中C#解决方案(ASP.NET WebForms)n中的所有异常隐藏/异常吞咽。
由于
编辑:
我有一个现有的解决方案,其中一些程序员使用hide / swallow异常(空catch,只捕获一些无用的代码)。我正在寻找一些方法在代码中找到所有这些地方,分析它们,然后修复它们。
答案 0 :(得分:8)
你可以使用Roslyn编写一些代码来轻松处理这个问题。
我实际上写了一些代码,以便为朋友做到这一点。这是我第一次尝试使用Roslyn SDK,所以我的代码可能是一个糟糕的混乱,但它绝对是功能。
static void Main(string[] args)
{
var result = Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree.ParseFile(@"..\..\Test.cs");
var root = result.GetRoot();
var exceptionNodes = FindCatchNodes(root);
foreach (var node in exceptionNodes)
{
var line = node.GetLocation().GetLineSpan().StartLinePosition.Line + 1;
if (IsTotallyEmptyCatch(node))
{
Console.WriteLine("Totally empty catch: line {0}", line);
}
if (JustRethrows(node))
{
Console.WriteLine("Pointless rethrow: line {0}", line);
}
}
}
static List<SyntaxNodeOrToken> FindCatchNodes(SyntaxNodeOrToken node)
{
var exceptions = new List<SyntaxNodeOrToken>();
var isCatchBlock = node.IsKind(SyntaxKind.CatchClause);
if (isCatchBlock)
{
exceptions.Add(node);
}
foreach (var result in node.ChildNodesAndTokens().Select(FindCatchNodes).Where(result => result != null))
{
exceptions.AddRange(result);
}
return exceptions;
}
static bool IsTotallyEmptyCatch(SyntaxNodeOrToken catchBlock)
{
var block = catchBlock.ChildNodesAndTokens().First(t => t.CSharpKind() == SyntaxKind.Block);
var children = block.ChildNodesAndTokens();
return (children.Count == 2 && children.Any(c => c.CSharpKind() == SyntaxKind.OpenBraceToken) &&
children.Any(c => c.CSharpKind() == SyntaxKind.CloseBraceToken));
}
static bool JustRethrows(SyntaxNodeOrToken catchBlock)
{
var block = catchBlock.ChildNodesAndTokens().First(t => t.CSharpKind() == SyntaxKind.Block);
var children = block.ChildNodesAndTokens();
return (children.Count == 3 && children.Any(c => c.CSharpKind() == SyntaxKind.OpenBraceToken) &&
children.Any(c => c.CSharpKind() == SyntaxKind.CloseBraceToken) && children.Any(c=>c.CSharpKind() == SyntaxKind.ThrowStatement));
}
鉴于此测试文件:
using System;
namespace RoslynTest
{
public class Test
{
public void Foo()
{
try
{
var x = 0;
}
catch
{
}
}
public void Bar()
{
try
{
var x = 0;
}
catch (Exception ex)
{
throw;
}
}
public void Baz()
{
try
{
var x = 0;
}
catch (Exception ex)
{
throw ex;
}
}
}
}
输出结果为:
完全空捕获:.... \ Test.cs:第12行
无意义的重新抛出:.... \ Test.cs:第24行
无意义的重绘:.... \ Test.cs:第37行
答案 1 :(得分:1)
我不了解内置方法。但是你可以编写自己的工具来找到这样的地方。只需在解决方案中正则表达所有文件并计算catch和throw。每个文件的数量应该相同:)