2010-11-24 2 views
10

Unterstützt C# das Kompilieren von Filtern? Wie funktionieren Filter überhaupt oder was machen sie?C# Ausnahmefilter?

Wie Reflektor dekompiliert einen Filter als

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

Sie eine bessere Definition oder Beispiel nach Ihren Wünschen hinzufügen kann filter :) –

+0

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf, # 23.3: Wie Ausnahmen behandelt werden –

+2

Siehe auch: http://StackOverflow.com/questions/181188/c-equivalent-to-vb-net-catch-wenn –

Antwort

5

C# nicht Ausnahme Filter wie VB tut bis C# 6. Was unterstützen, wie sie arbeiten, sehen Eric Lippert "Finally" Does Not Mean "Immediately"

Ab C# 6, Ausnahme Filter werden ebenso unterstützt wie the C# FAQ demonstrates:

try { … } 
catch (MyException e) when (myfilter(e)) 
{ 
    … 
} 

Wenn die parenthese Zed-Ausdruck nach 'if' [jetzt when] ergibt wahr, der catch-Block wird ausgeführt, sonst läuft die Exception weiter.

Ausnahmefilter sind vorzuziehen, da sie den Stapel unbeschädigt verlassen. Wenn die Ausnahme später dazu führt, dass der Stapel abgelegt wird, können Sie sehen, woher er ursprünglich stammt, und nicht nur den letzten Ort, an dem er erneut gestartet wurde.

Es ist auch eine übliche und akzeptierte Form des "Missbrauchs", Ausnahmefilter für Nebenwirkungen zu verwenden; z.B. protokollieren. Sie können eine Ausnahme "vorbeifliegen", ohne ihren Verlauf abzufangen. In diesen Fällen werden oft die Filter einen Anruf zu einer falsch-Rückkehr Helferfunktion sein, die die Nebenwirkungen führen:

private static bool Log(Exception e) { /* log it */ ; return false; } 
… 
try { … } 
catch (Exception e) when (Log(e)) {} 

Dank Mafii für den Link zu der C# 6 Dokumentation.

+0

Okay, Filter ist im Grunde nur eine if-Anweisung, und wenn sie nicht erfüllt wird, wird sie erneut angezeigt. – Will

+3

Nein, es ist subtil anders, da ein echter Filter es nicht einmal abfängt, wenn es entscheidet, die Ausnahme zu behandeln, während ein Workaround mit einem if es fängt und erneut wirft. Dies hat eine etwas andere Semantik in Bezug auf Stack-Abrollen. – CodesInChaos

+0

Es ist auch anders, wenn es läuft. Filter werden vor catch-Blöcken ausgeführt, selbst wenn diese Filter tiefer im Callstack definiert sind. –

23

Seit C# 6 können Sie dies jetzt tun.

try { … } 
catch (MyException e) when (myfilter(e)) 
{ 
    … 
} 

Dies unterscheidet sich von der Verwendung eines if Anweisung von innerhalb des catch Block unter Verwendung Ausnahme Filter nicht den Stapel entspannen.

4

Ausnahme Filter-Unterstützung in C# in C# 6 (Visual Studio "Dev14") eingeführt:

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 
} 
+2

'if' wurde in der letzten Ausgabe von C# 6 durch' when' ersetzt – Mafii

0

Während Ausnahmen fangen, wenn Sie die Ausnahmen anders behandeln wollen, dann können Sie Exception Filter
verwenden - Nach dem C# 6.0
- Nach VB 7.1 verwenden, wenn

1) C# Probe nach 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!"); 
} 

Hinweis: Beachten Sie, dass die Reihenfolge

2) C# Beispiel Bevor 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!"); 
    } 
} 

Da dieses Stück Code entspricht dem vorherigen zählt. bedeutet, sie sind gleichwertig, oder?--- „Aber Nein, sie sind nicht gleichwertig
HINWEIS: Ausnahmefilter abschalten nicht den Stapel

Lesen sie mehr von Here