Question

Dans VB.NET, j'ai souvent Catch & # 8230; Quand :

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

Existe-t-il un équivalent C # pour Catch & # 8230; When ?

Je ne souhaite pas utiliser une instruction si à l'intérieur d'un catch si possible.

Était-ce utile?

La solution

Cette fonctionnalité a été annoncée pour C # 6. Il est maintenant possible d'écrire

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

Vous pouvez télécharger l'aperçu de Visual Studio. 2015 maintenant pour vérifier cela ou attendre la sortie officielle.

Autres conseils

Il n'y a pas d'équivalent à Catch & # 8230; When en C #. Vous devrez vraiment recourir à une instruction si à l'intérieur de votre catch , puis la renvoyer si votre condition n'est pas remplie:

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

Cela ne recréera pas la même sémantique que l'expression VB Catch When. Il y a une différence clé. L'expression VB When est exécutée avant le déroulement de la pile. Si vous examiniez la pile au point d'un filtre when, vous verriez en fait le cadre dans lequel l'exception a été levée.

Avoir un if dans le bloc catch est différent parce que le bloc catch s'exécute après le déchargement de la pile. Ceci est particulièrement important lorsqu'il s'agit de signaler des erreurs. Dans le scénario VB, vous pouvez provoquer un incident avec une trace de pile, y compris l'échec. Ce comportement n’est pas possible en C #.

EDIT:

a écrit un article de blog détaillé sur le sujet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top