C # équivalent à Catch… de VB.NET quand
-
05-07-2019 - |
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.
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.