gpt4 book ai didi

c# - 在 VS2013 的 C# 代码中查找异常隐藏/吞噬

转载 作者:行者123 更新时间:2023-11-30 19:26:12 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com