SonarSource 规则 S2139 在 Program.cs 中触发(C#)

问题描述 投票:0回答:1

我遇到了 SonarSource 规则 S2139 的问题(异常应该被记录或重新抛出,但不能两者都记录)。

根据S2139规则说明:

当记录并重新抛出异常时,上游代码可能不知道异常已被记录。因此,同一异常会被记录多次,从而很难确定问题的根本原因。这在多线程应用程序中尤其成问题,因为来自其他线程的消息可能与重复的日志条目交织在一起。

但是,就我而言,代码气味是在最上游的代码

Program.cs
中检测到的。在代码中,我捕获异常并记录错误消息,如下所示:

try
{
    // omitting code
}
catch (Exception exception)
{
    logger.LogError(exception, "Stopped program because of exception");
    throw;
}
finally
{
    logger.LogInformation("**** SHUTDOWN Program ****");
    LogManager.Shutdown();
}

我是否误解了该规则,或者这可能是误报?我知道 SonarQube 中的“误报”和“不会修复”选项或抑制警告,但我想在继续之前确认我的理解。

任何见解将不胜感激。预先感谢!

c# .net exception sonarqube sonarlint
1个回答
0
投票

所以基本上在代码中你记录了两次异常,Sonar 说:有什么意义?为什么不只记录一次呢?

{
    // omitting code
}
catch (Exception exception)
{
    logger.LogError(exception, "Stopped program because of exception"); // already exception will logged here
    throw; // here again the exception will be logged
}
finally
{
    logger.LogInformation("**** SHUTDOWN Program ****");
    LogManager.Shutdown();
}

所以解决方案是记录或抛出异常:

1-抛出异常(如果你想停止应用程序)


{
    // omitting code
}
catch (Exception exception)
{
    throw;
}
finally
{
    logger.LogInformation("**** SHUTDOWN Program ****");
    LogManager.Shutdown();
}

2- 只需记录异常

{
    // omitting code
}
catch (Exception exception)
{
    logger.LogError(exception, "Stopped program because of exception");
}
finally
{
    logger.LogInformation("**** SHUTDOWN Program ****");
    LogManager.Shutdown();
}
© www.soinside.com 2019 - 2024. All rights reserved.