在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要到明年才会发布。)