Q
C#異常過濾器?
10
A
回答
5
C#不支持異常過濾器如VB做,直到C#6,至於他們是如何工作的,請參閱埃裏克利珀的"Finally" Does Not Mean "Immediately"
在C#6,異常啓動過濾器的支持,爲the C# FAQ demonstrates:
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
如果parenthesi如果'if'[現在的
when
]的計算結果爲true,catch塊會運行,否則異常會繼續。異常過濾器優於捕捉和重新拋出,因爲它們不會損壞堆棧。如果異常後來導致堆棧被轉儲,你可以看到它最初來自哪裏,而不僅僅是最後一個被重新放置的地方。
這也是一種常見和可接受的形式,濫用「使用異常過濾器的副作用;例如日誌記錄。他們可以檢查一個例外情況,而不會攔截其行程。在這種情況下,過濾器會經常打電話到執行副作用假返回輔助功能:
private static bool Log(Exception e) { /* log it */ ; return false; }
…
try { … }
catch (Exception e) when (Log(e)) {}
感謝Mafii的鏈接到C#6文檔。
23
既然C#6你現在可以做到這一點。
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
這是使用從catch
塊內的if
語句,並且使用例外濾波器不會展開堆棧不同。在C#
4
異常過濾器支持在C#6(Visual Studio的 「Dev14」)介紹:
try
{
throw new ApplicationException("1");
}
catch (ApplicationException ex) when (ex.Message == "2")
{
// this one won't execute.
}
catch (ApplicationException ex) when (ex.Message == "1")
{
// this one will execute
}
0
雖然捕獲異常,如果你想以不同的方式處理異常,那麼你可以使用異常過濾器
- 當使用
1)C#樣品後C#6.0
後
try
{
throw new CustomException { Severity = 100 };
}
catch (CustomException ex) when (ex.Severity > 50)
{
Console.WriteLine("*BING BING* WARNING *BING BING*");
}
catch (CustomException ex)
{
Console.WriteLine("Whooops!");
}
注:請記住,順序事項
2)C#示例之前C#6.0
try
{
throw new CustomException { Severity = 100 };
}
catch (CustomException ex)
{
if (ex.Severity > 50)
{
Console.WriteLine("*BING BING* WARNING *BING BING*");
}
else
{
Console.WriteLine("Whooops!");
}
}
由於這段代碼等同於前一個。意味着它們是等價的,對嗎?---「但是不,他們是不等價的」
注:在異常過濾器不會展開堆棧
閱讀更從Here
相關問題
- 1. C#異常過濾器性能
- 2. 帶過濾的C#異常監視器
- 3. F#異常過濾器
- 4. Struts2過濾器異常
- 5. 動作過濾器異常
- 6. MadExcept異常過濾器
- 7. 春季過濾器的異常處理
- 8. java異常字符串過濾器
- 9. RecyclerView.Adapter自定義過濾器異常
- 10. 開始過濾器的異常 - Servlet
- 11. 使用過濾器拋出異常
- 12. 處理異常IN動作過濾器
- 13. 異常開始過濾器Struts 2
- 14. Struts 2 - 異常開始過濾器struts2
- 15. javax.servlet.ServletException:過濾器執行拋出異常
- 16. 異常開始過濾器springSecurityFilterChain - org.springframework.beans.factory.NoSuchBeanDefinitionException
- 17. 異常啓動過濾器springSecurityFilterChain
- 18. 從異常過濾器重定向
- 19. 異常過濾器沒有觸發
- 20. SEVERE:異常啓動過濾器CORS
- 21. 異常開始過濾器springSecurityFilterChain java.lang.NoClassDefFoundError
- 22. 在Struts2中啓動過濾器異常
- 23. SpringBoot - 過濾器異常處理程序
- 24. 用於autofac的Api異常過濾器
- 25. 異常過濾器開始struts2的
- 26. SEVERE:異常開始過濾器struts2 java.lang.ExceptionInInitializerError
- 27. 使用異常過濾器記錄異常
- 28. log4net過濾異常消息?
- 29. DataModel必須使用primefaces過濾器實現org.primefaces.model.SelectableDataModel異常過濾器
- 30. 第一差異過濾器
您可以添加你想要一個更好的定義或示例過濾器:) – 2010-11-24 15:09:23
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf,#23.3:如何處理異常 – 2010-11-24 15:12:33
另請參閱:http://stackoverflow.com/questions/181188/c-equivalent-to-vb-net-catch-when – 2010-11-24 15:16:44