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

标签 c# visual-studio exception code-analysis static-code-analysis

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

相关文章:

c# - 如何在应用程序中使用引用同一 dll 的不同版本的两个 dll?

git - VSTS 取消保护 git 分支

java - SeekBar 设置 Max 和设置 Progress 的空指针异常

python - 不要在异常堆栈中显示 Python raise-line

c# - 调用另一个 Web 服务的 Web 服务是否有任何冲突?

c# - 具有存储库模式的领域模型

c# - 使用 MongoDB C# 驱动程序 : Wrapped or Un-Wrapped?

visual-studio-2010 - Visual Studio 2010 事件按钮消失了

c# - 如何将 JSON 复制并粘贴到 Eclipse 中并创建 .java?

java - ArrayList 迭代给出异常 java.util.ConcurrentModificationException