Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Roslyn Analyzer检测特定方法是否不包含try-catch块?_C#_Visual Studio_Roslyn_Roslyn Code Analysis - Fatal编程技术网

C# 如何使用Roslyn Analyzer检测特定方法是否不包含try-catch块?

C# 如何使用Roslyn Analyzer检测特定方法是否不包含try-catch块?,c#,visual-studio,roslyn,roslyn-code-analysis,C#,Visual Studio,Roslyn,Roslyn Code Analysis,我想分析一下 public void GetDetails() { try { //some code } catch() { //some code } } 在Roslyn Analyzer项目中,我有如下内容: public override void Initialize(AnalysisContext context) { context.RegisterSyntaxNodeAction(AnalyzeCode

我想分析一下

public void GetDetails()
{
   try
   {
       //some code
   }
   catch()
   {
       //some code
   }
}
在Roslyn Analyzer项目中,我有如下内容:

public override void Initialize(AnalysisContext context)
{
      context.RegisterSyntaxNodeAction(AnalyzeCode, SyntaxKind.MethodDeclaration);
}

private void AnalyzeCode(SyntaxNodeAnalysisContext context)
{
     //I want here something like below
     context.RegisterSyntaxNodeAction(ctx =>
     {
           //set some flag
     }, SyntaxKind.TryStatement);

     //similar for catch block
}
所以,根据标志,我可以确定try-catch是否存在

我想通过在AnalyzeCode()方法中编写代码,以便只扫描MethodDeclaration,从而找到GetDetails()方法中存在的“try”和“catch”语句

注意:应忽略注释行


提前感谢。

您需要分析方法,而不是单个try语句。另外,我更喜欢将lambda提取到它自己的方法中,因此它看起来像这样:

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(
        AnalyzeMethodForMissingTryBlock, SyntaxKind.MethodDeclaration);
}

private void AnalyzeMethodForMissingTryBlock(SyntaxNodeAnalysisContext context)
{
    // Search all descendants for a try statement
    if (context.Node.DescendantNodes().Any(n => n.Kind() == SyntaxKind.TryStatement))
    {
        return;
    }

    // Try block was not found, so we report a diagnostic
    var method = (MethodDeclarationSyntax)context.Node;
    var diagnostic = Diagnostic.Create(
        Rule, 
        context.Node.GetLocation(), 
        method.Identifier.Text);

    context.ReportDiagnostic(diagnostic);
}