C# 6.0 - Exception filters

Exception filters 是預計要在 C# 6.0 釋出的新功能,目前已可在 Visual Studio 14 中透過設定將功能開啟進行體驗,只要在方案檔中加上:

<LangVersion>experimental</LangVersion>

或是透過 .Net Fiddle 也可以,Compiler 那邊選取 Roslyn 就可以了。


Exception filters 能讓開發人員很容易的在攔截例外時順帶做些過濾的動作,藉此處理符合過濾條件的例外,且不對例外呼叫堆疊造成不良的影響。


以往我們必須要先將例外攔截,接著進行比對過濾,最後將符合的例外做對應的處理,不符合的例外繼續讓它向外擴出。但是這樣的作法會讓例外呼叫堆疊看不到實際發生的例外點,只看到重新擴出例外的點,造成除錯上的困難。


Exception filters 的出現能幫助開發人員解決這樣的問題。


它的語法很直覺,簡單來說就只是在 Try/Catch 的 Catch 後面加上 if 條件式進行過濾。

try {...} catch(Exception e) if (...) {...}


程式寫起來會像下面這樣:


反組譯看一下,可以看到 Exception filters 這邊會被編譯成 filter 區塊的部份,從 IL 這邊就直接支援。


這樣的寫法不僅直覺,且不會對例外呼叫堆疊造成不良的影響。


最後這邊做個新舊方法的測試比較:


可以看到效能的部份其實是差不多的,新語法感覺是沒有任何的效能優化。