如何在 C# 中不鼓励在方法中编写多个异常

本文关键字:异常 方法 | 更新日期: 2023-09-27 17:57:00

我的代码看起来像这样:

try
{
   foo();
}
catch (SecurityTokenValidationException ex)
{
    Logger.ErrorFormat(ex.Message, ex);
    return null;
}
catch (SignatureVerificationFailedException ex)
{
    Logger.ErrorFormat(ex.Message, ex);
    return null;
}

但代码分析报告"Avoid Excessive Complexity"

有什么指示吗?

如何在 C# 中不鼓励在方法中编写多个异常

如果您使用的是 C# 6,则可以通过异常筛选将处理限制为两种类型:

try
{
    foo();
}
catch (Exception ex) when (ex is SecurityTokenValidationException || ex is SignatureVerificationFailedException)
{
    Logger.ErrorFormat(ex.Message, ex);
    return null;
}

因此,您不必错误地捕获SecurityTokenException的其他子类型。

例如,您可以简化返回语句,仅在某些失败时使用返回 null。

下面是一些伪代码示例:

bool success;
try
{
   success = foo();
}
catch (SecurityTokenValidationException ex)
{
    Logger.ErrorFormat(ex.Message, ex);
}
catch (SignatureVerificationFailedException ex)
{
    Logger.ErrorFormat(ex.Message, ex);
}
if(success) 
{
    return result;
}
return null;

或者另一个例子。

try
{
   return foo();
}
catch (SecurityTokenValidationException ex)
{
    Logger.ErrorFormat(ex.Message, ex);
}
catch (SignatureVerificationFailedException ex)
{
    Logger.ErrorFormat(ex.Message, ex);
}
return null;

最后,我求助于使用一个异常,它是上述两个异常的基类。

换句话说,

try
{
   foo();
}
catch (SecurityTokenException ex)
{
    Logger.ErrorFormat(ex.Message, ex);
    return null;
}

SecurityTokenValidationException1SignatureVerificationFailedException都源于SecurityTokenException

现在,代码分析令人满意:)