Domanda

In VB.NET spesso Cattura & # 8230; Quando :

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

Esiste un C # equivalente a Catch & # 8230; Quando ?

Non voglio ricorrere all'uso di un'istruzione if all'interno di un catch se possibile.

È stato utile?

Soluzione

Questa funzionalità è stata annunciata per C # 6. Ora è possibile scrivere

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

Puoi scaricare l'anteprima di Visual Studio 2015 ora per dare un'occhiata o attendere l'uscita ufficiale.

Altri suggerimenti

Non esiste un equivalente a Cattura & # 8230; Quando in C #. Dovrai davvero ricorrere a un'istruzione if all'interno del tuo catch , quindi ripetere la ricerca se la tua condizione non è soddisfatta:

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

Ciò non ricrea la stessa semantica dell'espressione VB Catch When. C'è una differenza chiave. Il VB Quando viene eseguita l'espressione prima che si verifichi lo svolgersi dello stack. Se dovessi esaminare la pila nel punto di quando filtro, vedresti effettivamente il frame in cui è stata generata l'eccezione.

Avere un if nel blocco catch è diverso perché il blocco catch viene eseguito dopo che lo stack è stato svolto. Ciò è particolarmente importante quando si tratta di segnalare errori. Nello scenario VB hai la possibilità di bloccarsi con una traccia dello stack incluso l'errore. Non è possibile ottenere quel comportamento in C #.

EDIT:

Ha scritto un post di blog dettagliato sull'argomento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top