2016-07-14 61 views
3

我的代码看起来就像这样:如何在C#中不鼓励使用方法编写多个异常?

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"

任何指针?

+0

只要压制警告。 –

+1

我不明白为什么这应该被称为“嵌套”。我的猜测是,你不应该从'catch'回来。 – Filburt

+4

函数中可能还有其他代码与显示的代码一起导致警告。按照警告告诉你:重构函数。例如。将它分成两个或更多更简单的功能。 – Henrik

回答

3

如果您正在使用C#6可以限制处理,以你的两个类型的例外过滤

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

所以你不”不得不潜在地捕获其他子类型SecurityTokenException错误。

+0

请注意,仅在最新版本的C#版本6中添加时。 –

+0

@MartinBrown正确,我会在答案中添加注释。 –

+0

你的意思是C#7.去年C#6出现了。 (C#7直到明年才会发布。) –

1

例如,您可以简化返回语句,只有在出现失败的情况下才使用返回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; 
1

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

换句话说,

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

两个​​和SignatureVerificationFailedExceptionSecurityTokenException导出。

现在,代码分析是快乐:)

+1

如果有其他类从** SecurityTokenException **继承,这可能会捕获你可能不想捕获的异常。 –

+0

对于这种情况,C#6答案更好。 Uno的评论是完全正确的 - 你可能最终会捕获你可能想要以不同方式处理的异常。 – series0ne

相关问题