2010-11-24 83 views
10

C#是否支持編譯過濾器?過濾器如何工作,或者他們做了什麼?C#異常過濾器?

像反射反編譯一個過濾器

try 
{ 
} 
catch(Exception e) when (?) 
{ 
}
+0

您可以添加你想要一個更好的定義或示例過濾器:) – 2010-11-24 15:09:23

+0

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf,#23.3:如何處理異常 – 2010-11-24 15:12:33

+2

另請參閱:http://stackoverflow.com/questions/181188/c-equivalent-to-vb-net-catch-when – 2010-11-24 15:16:44

回答

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

後VB 7.1 - 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