簡體   English   中英

如何使用 Roslyn Analyzer 檢測特定方法是否不包含 try catch 塊?

[英]How can i detect if a specific method does not contain try catch block using Roslyn Analyzer?

我想分析類似的東西

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()方法中編寫代碼來查找 GetDetails () 方法中存在的“try”和“catch”語句,這樣它應該只掃描 MethodDeclaration。

注意:應忽略注釋行。

提前致謝。

您需要分析方法,而不是單獨的 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);
}

暫無
暫無

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

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