2008-10-08 6 views
13

In VB.NET Catch…When ich oft:C# entspricht VB.NET Catch ... Wenn

Try 
    … 
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES" 
    … 
End Try 

eine C# entspricht Catch…When Gibt es?

Ich möchte nicht auf eine if Anweisung innerhalb einer catch zurückgreifen, wenn möglich.

+0

Überprüfen Sie diese Seite http://StackOverflow.com/Questions/4269189/c-Exception-Monitor-with-Filtering;) – Edward83

Antwort

12

Diese Funktionalität wurde für C# 6. angekündigt Es ist nun möglich

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

Sie schreiben können die Vorschau von Visual Studio 2015 jetzt downloaden Sie dieses heraus zu überprüfen, oder für den offiziellen Release warten.

15

Es gibt keine Entsprechung zu Catch…When in C#. Sie werden wirklich in Ihrem catch auf eine if Aussage zurückgreifen müssen, dann erneut auslösen, wenn Ihr Zustand nicht erfüllt ist:

try 
{ 
    … 
} 
catch (ArgumentNullException e) 
{ 
    if ("SAMPLES" == e.ParamName.ToUpper()) 
    { 
     … // handle exception 
    } 
    else 
    { 
     throw; // condition not fulfilled, let someone else handle the exception 
    } 
} 
+2

Ich bin mit Cruizer und Nicholas Mancuso, einfach mit 'throw' bewahrt den Stack [The Mistake Jeder C# -Programmierer macht] (http://msmvps.com/blogs/nickwienholt/archive/2006/07/04/103778.aspx "Der Fehler, den jeder C# -Programmierer macht") – bob31334

+0

@ bob31334 Nur der im Ausnahmeobjekt erfasste Stapel Der Status des Programms wurde jedoch bereits geändert und der ursprüngliche Stack wurde zerstört, und schließlich werden Blöcke bereits ausgeführt (mit anderen Worten, wenn der Filter auf der Fang-Anweisungsebene und nicht im Handler ausgeführt wird, ähnelt dies SEH in win32 API) –

12

Das wird die gleiche Semantik wie die VB fangen, wenn Ausdruck nicht neu erstellen. Es gibt einen entscheidenden Unterschied. Der VB-When-Ausdruck wird ausgeführt, bevor der Stapelabbau auftritt. Wenn Sie den Stapel an der Stelle eines WENN-Filters untersuchen würden, würden Sie tatsächlich den Rahmen sehen, in dem die Ausnahme ausgelöst wurde.

Ein if im catch-Block ist anders, weil der catch-Block ausgeführt wird, nachdem der Stapel abgewickelt wurde. Dies ist besonders wichtig bei der Fehlerberichterstattung. Im VB-Szenario können Sie mit einer Stack-Ablaufverfolgung einschließlich des Fehlers abstürzen. Es ist nicht möglich, dieses Verhalten in C# zu erhalten.

EDIT:

Schrieb ein detailed blog post zum Thema.

+0

bist du sicher? Sie können einfach "werfen" verwenden. anstelle von "werfen e;" –

+0

100% Es hat nichts mit Wurf zu tun. Es ist, wenn der Ausdruck von When ausgeführt wird. In VB wird es passieren, während der Ausnahmeerhöhungspunkt noch auf dem Stapel ist. – JaredPar

+0

In C#, auch wenn der Stapel ausgelagert ist - das Exception-Objekt 'e' hat immer noch den Stapel-Trace verfügbar. aber es ist wahrscheinlich nicht so hilfreich, da der gesamte Stack zur Debugzeit verfügbar ist. aber für die Laufzeit loggen Info Stack-Trace würde ausreichen? – dotnetcoder