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

时间:2016-07-14 10:38:54

标签: c# .net exception exception-handling

我的代码看起来像这样:

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"

任何指针?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

例如,您可以通过仅在出现故障时使用return null来简化return语句。

以下是一些伪代码示例:

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;

答案 2 :(得分:1)

最后,我使用了一个例外,它是上述两个例外的基类。

换句话说,

RowDetail

try { foo(); } catch (SecurityTokenException ex) { Logger.ErrorFormat(ex.Message, ex); return null; } SecurityTokenValidationException1都来自SignatureVerificationFailedException

现在,代码分析很高兴:)