2016-07-14 41 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

相關問題