在 VS2013 的 C# 解决方案 (ASP.NET WebForms) 中是否有内置函数/扩展/工具来查找所有异常隐藏/异常吞噬的方法。
谢谢
编辑:
我有一些现有的解决方案,其中一些程序员使用隐藏/吞噬异常(空捕获,仅捕获一些无用代码)。我正在寻找某种方法来找到代码中的所有这些位置,分析它们,然后修复它们。
最佳答案
您可以使用 Roslyn 编写一些代码来轻松处理此问题。
我实际上写了一些代码来为 friend 做这件事。这是我第一次尝试使用 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 行
关于c# - 在 VS2013 的 C# 代码中查找异常隐藏/吞噬,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24763154/