2

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

感謝

編輯:

我有現成的解決方案,其中一些程序員使用隱藏/吞嚥異常(空抓,只能用一些無用的代碼趕上)。我正在尋找一些方法在代碼中找到所有這些地方,分析它們,然後修復它們。

+0

您正在尋找一個全局錯誤處理程序,它將捕獲任何在ASP.NET網站中未處理的異常?如果是這樣,[它曾被問過很多次](http://stackoverflow.com/search?q=asp.net+global+error+handler)。 – David

+0

我有現有的解決方案,其中一些程序員使用隱藏/吞下異常(空捕獲,只捕獲一些無用的代碼)。我正在尋找一些方法在代碼中找到所有這些地方,分析它們,然後修復它們。 – Cicik

+0

搜索? 'ctrl-f'「catch(」 – mxmissile

回答

1

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

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; 
      } 
     } 
    } 
} 

的輸出是:

共空的catch:.... \ test.cs中:行12

無意義重新拋出。 ... \ Test.cs:line 24

毫無意義的重投:.... \ Test.cs:line 37

+0

感謝指向我的Roslyn SDK,非常漂亮的工具 – Cicik