我遇到了 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 中的“误报”和“不会修复”选项或抑制警告,但我想在继续之前确认我的理解。
任何见解将不胜感激。预先感谢!
所以基本上在代码中你记录了两次异常,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();
}