14 votes

L'équivalent en C# de la fonction Catch...When de VB.NET

En VB.NET, j'ai souvent Catch…When :

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

Existe-t-il un équivalent en C# de Catch…When ?

Je ne veux pas avoir à utiliser un if à l'intérieur d'un catch si possible.

15voto

cruizer Points 4821

Il n'y a pas d'équivalent à Catch…When en C#. Vous devrez vraiment avoir recours à un if à l'intérieur de votre catch puis relance si la 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
    } 
}

15voto

Joe Points 758

Cette fonctionnalité a été annoncée pour C# 6. Il est désormais 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 tout cela, ou attendez la sortie officielle.

12voto

JaredPar Points 333733

Cela ne recréera pas la même sémantique que l'expression Catch When de VB. Il y a une différence essentielle. L'expression VB When est exécutée avant que le déroulement de la pile ne se produise. Si vous deviez examiner la pile au moment d'un filtre when, vous verriez en fait le cadre où l'exception a été levée.

Le fait d'avoir un if dans le bloc catch est différent car le bloc catch s'exécute après le déroulement de la pile. Ceci est particulièrement important lorsqu'il s'agit de signaler des erreurs. Dans le scénario VB, vous avez la possibilité de planter avec une trace de la pile incluant l'échec. Il n'est pas possible d'obtenir ce comportement en C#.

EDIT :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X