5 votes

Comment afficher une liste d'objets dans une exception ?

Je passe une liste d'objets personnalisés à ma classe d'exception personnalisée et j'ai besoin d'afficher tous les objets dans le message. Comment puis-je faire cela ?

public class MissingUnitSNSException : Exception
{
    public MissingUnitSNSException()
    {

    }

    public MissingUnitSNSException(List<UnitViewModel> missingsns)
        : base(String.Format("Serial Numbers not found: {0}", missingsns))
    {

    }
}

L'erreur m'indique le type d'objet, mais j'ai besoin de l'attribut du numéro de série qui est lié à chaque objet de la liste.

5voto

dvo Points 2048

Que diriez-vous de remplacer missingsns avec une chaîne de numéros de série séparés par des virgules. Comme ça :

string.join(", ", missingsns.Select(sns => sns.SerialNumber.ToString()))

Cela devrait énumérer les numéros de série comme : A01, B01, C02, ...


Ligne complète :

public MissingUnitSNSException(List<UnitViewModel> missingsns)
        : base(String.Format("Serial Numbers not found: {0}", 
                  string.join(", ", missingsns.Select(sns => sns.SerialNumber.ToString()))))

1voto

Christopher Points 56

Veuillez ne pas mettre d'informations importantes dans le champ de message. Les faire sortir sera une souffrance pour l'utilisateur de votre code !

Les exceptions sont des classes. Ajoutez une propriété en lecture seule pour ces données. Ajoutez-la à ce que ToString() retournera. C'est l'une des règles de base de la gestion correcte des exceptions :

Maintenant, avec les objets, vous ne voulez probablement pas attribuer de référence à l'exception. Non seulement l'exception pourrait maintenir les objets en vie, mais il est fort probable que Dispose soit appelé sur ces instances avant que vous ne traitiez l'exception, ce qui rendrait ces références plutôt inutiles.

Comme vous semblez vous contenter "uniquement" de données de type chaîne, une string[] pourrait être un bon type. Il faut penser à le cloner superficiellement lorsqu'on le distribue, mais sinon c'est une propriété normale en lecture seule des exceptions.

0voto

Ok, pour que vous puissiez montrer l'attribut du numéro de série qui est lié à chaque objet dans la liste, vous devez aller dans la liste et sélectionner tous les attributs du numéro de série comme ceci :

public class ExceptionClass: Exception   
{
      public ExceptionClass()
      {

      }
      public ExceptionClass(List<string> names) :base(String.Format("String with ID :{0} not found", string.Join(", ", names.Select(sns => sns.SerialNumber.ToString()))))
      {

      }

  }

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