2015-11-19 20 views
22

Il seguente è un esempio tratto dalla MSDN, try-catch (C# Reference)C# - try/catch con l'espressione del predicato

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

Dicono anche

Utilizzando argomenti di cattura è un modo per filtrare le eccezioni che si desidera gestire . È inoltre possibile utilizzare un'espressione di predicato che esamina ulteriormente l'eccezione per decidere se gestirla. Se l'espressione del predicato restituisce false, la ricerca di un gestore continua.

I filtri di eccezione sono preferibili alla cattura e al rethrowing (spiegato di seguito) perché i filtri lasciano lo stack illeso. Se un gestore successivo scarica lo stack, puoi vedere da dove proviene l'eccezione, piuttosto che l'ultimo posto in cui è stato riscritto. Un uso comune delle espressioni del filtro delle eccezioni è la registrazione. È possibile creare una funzione di predicato che restituisce sempre false che vengono anche esportate in un log, è possibile registrare le eccezioni mentre procedono senza doverle gestire e retrocedere.

Il mio codice:

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) 
    { 
     // .... 
    } 
} 

Ora, il compilatore non compilare questo (csc.exe), dando il seguente messaggio di errore:

error CS1003: Syntax error, 'when' expected 

Edit: Il compilatore genera il errore per la linea

error CS1003: Syntax error, 'when' expected 

Cosa sto facendo male?

Grazie.

MODIFICA: Ho inviato un feedback a MSDN indicando l'errore nella documentazione.

+2

La logica del filtro di cattura è disponibile solo come parte di VS2015. È questa la versione che stai usando? – AWinkle

+2

Per quanto mi ricordo, se è stato sostituito con la parola chiave 'when' quando cerco di scambiare se a quando – MajkeloDev

+0

sto compilando tramite 'Prompt dei comandi dello sviluppatore per VS2015', quindi sì. Ho una community di Visual Studio 2015. – jensa

risposta

22

Questo è un errore sul sito MSDN. Come suggerisce il compilatore, è necessario utilizzare when anziché if.

+0

Esiste una specifica lingua per una versione di C# che ha questa funzione? – recursive

+0

Grazie, ha funzionato! Credo che qualcuno dovrebbe indicarlo ai ragazzi di MSDN. – jensa

+0

@recursive Sembra che l'ultima versione della specifica sia per C# 5.0 –

Problemi correlati