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

在C#中不鼓励方法时,如何在方法中写入多个异常?,c#,.net,exception,exception-handling,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; } 但是代码分析报

我的代码如下所示:

try
{
   foo();
}
catch (SecurityTokenValidationException ex)
{
    Logger.ErrorFormat(ex.Message, ex);
    return null;
}
catch (SignatureVerificationFailedException ex)
{
    Logger.ErrorFormat(ex.Message, ex);
    return null;
}
但是代码分析报告“避免过度复杂”


任何指针?

例如,您可以简化返回语句,只在出现故障时使用returnnull

以下是一些伪代码示例:

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;
}
securitytokenvalidationexception 1
signatureificationfailedeexception
都源自
SecurityTokenException

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

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

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

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

只需抑制警告。我不知道为什么应该将其称为“嵌套”。我的猜测是,您不应该从
catch
返回。函数中可能有其他代码与显示的代码一起导致警告。按照警告告诉您的操作:重构函数。例如,将其拆分为两个或多个更简单的函数。如果在异常处理程序之间执行不同的操作,则此方法绝对没有问题。如果您处理的所有类型都是相同的,那么它是不必要的,也可能只是捕获Exception@LDJ-仅当
foo
只能抛出这两个特定异常时。否则,您将更改行为(捕获、记录和吞并两个异常。所有其他异常将进一步向上传播)。如果有其他类继承自SecurityTokenException,则这可能会捕获您可能不希望捕获的异常。C#6答案更适合此场景。Uno的评论完全正确-您可能会发现您可能希望以不同方式处理的异常。注意,仅在最新版本的C#,第6版中添加了使用when。@MartinBrown True,我会在答案中添加注释。您的意思是C#7。C#6去年问世。(C#7要到明年才会发布。)