簡體   English   中英

在VS2013中查找C#代碼中的異常隱藏/吞咽

[英]Find exception hiding/swallowing in C# code in VS2013

是否有一些內置在函數/擴展/工具中的方法來查找VS2013中C#解決方案(ASP.NET WebForms)n中的所有異常隱藏/異常吞咽。

謝謝

編輯:

我有一個解決方案,其中一些程序員使用hide / swallow異常(空catch,只捕獲一些無用的代碼)。 我正在尋找一些方法來在代碼中找到所有這些地方,分析它們,然后修復它們。

您可以使用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行

我不知道內置方法。 但是你可以編寫自己的工具來找到這樣的地方。 只需在解決方案中正則表達所有文件並計算catch和throw。 每個文件的數量應該相同:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM