2015-11-19 14 views
22

Poniżej jest przykład wzięty z MSDN, try-catch (C# Reference)C# - try/catch z ekspresją kwantyfikatorów

catch (ArgumentException e) if (e.ParamName == "…") 
{ 
} 

Mówią także

Używanie argumentów połów jest jeden sposób, aby filtrować dla wyjątków, które chcesz obsługiwać . Możesz także użyć wyrażenia predykatu, które dodatkowo bada wyjątek, aby zdecydować, czy go obsłużyć. Jeśli wyrażenie predykatu zwraca wartość false, to wyszukiwanie procedury obsługi jest kontynuowane.

Filtry wyjątków są lepsze od łapania i ponownego rzucania (wyjaśnione poniżej), ponieważ filtry pozostawiają stos bez szwanku. Jeśli późniejszy handler zrzuca stos, możesz zobaczyć, skąd pochodzi wyjątek, a nie tylko ostatnie miejsce, w którym został ponownie wydany. Najczęstszym zastosowaniem wyrażeń filtru wyjątku jest rejestrowanie. Możesz utworzyć funkcję predykatu, która zawsze zwraca wartość false, która również generuje logi, możesz rejestrować wyjątki podczas ich przechodzenia, bez konieczności ich obsługi i ponownego rzucania.

Mój kod:

static bool LogFunction(System.Exception ex) 
{ 
    System.Console.WriteLine("Writing to logfile: {0}", ex.Message); 
    return false; 
} 

static void Main(string[] args) 
{ 
    try 
    { 
     throw new System.ArgumentException("The exception message..."); 
    } 
    catch(System.Exception ex) if (LogFunction(ex)) 
    { 
     System.Console.WriteLine("This will not be executed, ever!"); 
    } 
    catch(System.ArgumentException ex) 
    { 
     // .... 
    } 
} 

Teraz, kompilator nie będzie skompilować ten (csc.exe), podając następujący komunikat o błędzie:

error CS1003: Syntax error, 'when' expected 

EDIT: Kompilator podnosi błąd dla linii

error CS1003: Syntax error, 'when' expected 

Co robię źle?

Dzięki.

EDYCJA: Prześlij opinię do MSDN, wskazując błąd w dokumentacji.

+2

Logika filtru catch dostępna jest tylko jako część VS2015. Czy to jest wersja, z której korzystasz? – AWinkle

+2

O ile pamiętam, jeśli zostało ono zastąpione słowem kluczowym "kiedy", staram się zamienić, jeśli podczas – MajkeloDev

+0

kompiluję za pomocą "Wiersza poleceń programisty dla VS2015", więc tak. Mam społeczność Visual Studio 2015. – jensa

Odpowiedz

22

To błąd na stronie MSDN. Zgodnie z sugestią kompilatora, należy użyć when zamiast if.

+0

Czy jest dostępna specyfikacja językowa dla wersji C#, która ma tę funkcję? – recursive

+0

Dzięki, zadziałało! Wydaje mi się, że ktoś powinien wskazać to użytkownikom MSDN. – jensa

+0

@recursive Wydaje się, że najnowsza wersja specyfikacji jest dla C# 5.0 –