Skip to content

Attraper/Modifier (Message)/Relancer Exception du même type

Solution:

Ce que vous essayez de faire ici n’est pas aussi facile qu’il y paraît et il y a beaucoup de pièges à prendre en compte.

N’oubliez pas que Convert.ChangeType() convertira un type en un autre (en supposant qu’un tel chemin existe, comme convertir une chaîne en un int par exemple). La plupart des exceptions ne le feront pas (Pourquoi le feraient-elles ?)

Pour y parvenir, vous devrez examiner le type d’exception au moment de l’exécution avec la méthode GetType() et localiser un constructeur qui a des exigences que vous pouvez satisfaire et l’invoquer. Soyez prudent ici, puisque vous n’avez aucun contrôle sur la façon dont tous des exceptions sont définies, il n’y a aucune garantie que vous aurez accès aux constructeurs “standard”.

Cela étant dit, si vous avez envie d’enfreindre les règles, vous pouvez faire quelque chose comme ça…

void Main()
{
    try
    {   
        throw new Exception("Bar");
    }
    catch(Exception ex)
    {
        //I spit on the rules and change the message anyway
        ex.GetType().GetField("_message", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(ex, "Foo");
        throw ex;
    }
}

Vous pouvez faire cela pour appeler dynamiquement le constructeur du type d’exception :

object newEx = Activator.CreateInstance(ex.GetType(), new object[] { msg });

Votre code d’origine échouerait à l’exécution, car pour Convert.ChangeType pour fonctionner, le type d’exception devrait implémenter IConvertible et prend en charge la conversion vers l’autre type d’exception, ce dont je doute.

C’est peut-être un peu tard, mais est-ce que cela fonctionnerait pour vous ?

catch (Exception ex)
{
    throw new Exception("New message", ex);
}



Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *