是否有一些內置於函數/擴展/工具中的方法來查找VS2013中的C#解決方案(ASP.NET WebForms)n中的所有異常隱藏/異常吞吐。查找在VS2013 C#代碼中的異常隱藏/吞嚥
感謝
編輯:
我有現成的解決方案,其中一些程序員使用隱藏/吞嚥異常(空抓,只能用一些無用的代碼趕上)。我正在尋找一些方法在代碼中找到所有這些地方,分析它們,然後修復它們。
是否有一些內置於函數/擴展/工具中的方法來查找VS2013中的C#解決方案(ASP.NET WebForms)n中的所有異常隱藏/異常吞吐。查找在VS2013 C#代碼中的異常隱藏/吞嚥
感謝
編輯:
我有現成的解決方案,其中一些程序員使用隱藏/吞嚥異常(空抓,只能用一些無用的代碼趕上)。我正在尋找一些方法在代碼中找到所有這些地方,分析它們,然後修復它們。
我不知道內置的方法。但是你可以編寫你自己的工具來找到這樣的地方。只需將解決方案中的所有文件進行正則表達式並計數即可。每個文件應該有相同的數量:)
你可以使用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
感謝指向我的Roslyn SDK,非常漂亮的工具 – Cicik
您正在尋找一個全局錯誤處理程序,它將捕獲任何在ASP.NET網站中未處理的異常?如果是這樣,[它曾被問過很多次](http://stackoverflow.com/search?q=asp.net+global+error+handler)。 – David
我有現有的解決方案,其中一些程序員使用隱藏/吞下異常(空捕獲,只捕獲一些無用的代碼)。我正在尋找一些方法在代碼中找到所有這些地方,分析它們,然後修復它們。 – Cicik
搜索? 'ctrl-f'「catch(」 – mxmissile