none
Problème pour tester les propriétés non initialisées RRS feed

  • Question

  • Bonjour,

    Comment ne pas générer une erreur lorsque l'on teste une propriété d'un objet non initialisé ?

    Exemples :

    If e.button=Windows.Forms.MouseButtons.Right

    If Grille.Currentcell=Grille(0,0)

    Lorsque e.button ou Grille.CurrentCell= nothing il y a génération d'une erreur.

    Ce problème est récurrent à tous les tests sur les propriétés non initialisées.

    On ne peut pas tester toutes les propriétés avec If IsNothing(propriété), cela devient trop fastidieux.

    Quelqu'un a t'il une astuce ?

    Cordialement.

    vendredi 23 mars 2012 08:20

Réponses

  • Ben si, faut tester avec IsNothing, et ce n'est pas si fastidieux que cela.

    Ce qui est fastidieux, c'est d'avoir à répondre à vos clients qui vous appellent régulièrement parce que l'appli plante ;-))

    En revanche, que le e.Button puisse être nul, cela me semble bizarre si vous êtes dans un évènement de type MouseClick. Si c'est un MouseMove, c'est normal alors de devoir tester. Maintenant, une bonne pratique consiste à tester les conditions d'éxécution d'une méthode au début de ladite méthode :

        Public Sub MyMethod(sender As Object, e As MouseEventArgs)
            ' validation/tests des arguments
            If (e.Button = MouseButtons.None OrElse CurrentCell Is Nothing) Then Return
    
            'la suite
        End Sub

    Et pour toute méthode publique, tester les arguments et déclencher une exception si les arguments attendus sont mal formés :

        ''' <summary>
        ''' Attend une cellule, mais surtout pas de type CellPerson
        ''' </summary>
        ''' <param name="currentCell"></param>
        ''' <remarks></remarks>
        Public Sub MyAction(currentCell As Object)
            ' validation
            If (currentCell Is Nothing) Then
                Throw New ArgumentNullException("currentCell")
            End If
    
            If (TypeOf (currentCell) Is CellPerson) Then
                Throw New ArgumentException("currentCell ne peut être de type CellPerson", "currentCell")
            End If
    
            'la suite
        End Sub



    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Proposé comme réponse Nico Boey vendredi 23 mars 2012 08:57
    • Marqué comme réponse Ciprian Duduiala jeudi 29 mars 2012 07:05
    vendredi 23 mars 2012 08:37
  • Bonjour,

    Pouvez vous nous fournir un bloque de code complet où l'exception est levée (méthode, par exemple) ?

    Enfin de mieux comprendre le problème car il m’apparaît évident que ça puisse provoquer une erreur que l'on écrive une instruction du genre :

    Nothing.XXX

    Telle instruction est équivalant à accéder à un objet non initialisé (si on peut l'appeler déjà un objet car il n'existe pas encore).

    Cordialement.

    vendredi 23 mars 2012 08:50
    Auteur de réponse
  • C'est le e qui est nul alors, pas le e.Button

    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 23 mars 2012 09:22

Toutes les réponses

  • Ben si, faut tester avec IsNothing, et ce n'est pas si fastidieux que cela.

    Ce qui est fastidieux, c'est d'avoir à répondre à vos clients qui vous appellent régulièrement parce que l'appli plante ;-))

    En revanche, que le e.Button puisse être nul, cela me semble bizarre si vous êtes dans un évènement de type MouseClick. Si c'est un MouseMove, c'est normal alors de devoir tester. Maintenant, une bonne pratique consiste à tester les conditions d'éxécution d'une méthode au début de ladite méthode :

        Public Sub MyMethod(sender As Object, e As MouseEventArgs)
            ' validation/tests des arguments
            If (e.Button = MouseButtons.None OrElse CurrentCell Is Nothing) Then Return
    
            'la suite
        End Sub

    Et pour toute méthode publique, tester les arguments et déclencher une exception si les arguments attendus sont mal formés :

        ''' <summary>
        ''' Attend une cellule, mais surtout pas de type CellPerson
        ''' </summary>
        ''' <param name="currentCell"></param>
        ''' <remarks></remarks>
        Public Sub MyAction(currentCell As Object)
            ' validation
            If (currentCell Is Nothing) Then
                Throw New ArgumentNullException("currentCell")
            End If
    
            If (TypeOf (currentCell) Is CellPerson) Then
                Throw New ArgumentException("currentCell ne peut être de type CellPerson", "currentCell")
            End If
    
            'la suite
        End Sub



    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Proposé comme réponse Nico Boey vendredi 23 mars 2012 08:57
    • Marqué comme réponse Ciprian Duduiala jeudi 29 mars 2012 07:05
    vendredi 23 mars 2012 08:37
  • NB: pénible que la coloration syntaxique de VB .NET soit mauvaise dans ce forum!!!

    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 23 mars 2012 08:38
  • Bonjour,

    Pouvez vous nous fournir un bloque de code complet où l'exception est levée (méthode, par exemple) ?

    Enfin de mieux comprendre le problème car il m’apparaît évident que ça puisse provoquer une erreur que l'on écrive une instruction du genre :

    Nothing.XXX

    Telle instruction est équivalant à accéder à un objet non initialisé (si on peut l'appeler déjà un objet car il n'existe pas encore).

    Cordialement.

    vendredi 23 mars 2012 08:50
    Auteur de réponse
  • Merci pour votre réponse.

    Pour e.button, l'erreur provient du fait que j'ai appellé une procédure évenementielle (pour éviter de réécrire le code) sans initialiser le propriété testée. Ce n'est pas un click qui a appelé la procédure.

    Pour le reste, je vais gérer la possibilité de l'erreur. 

    vendredi 23 mars 2012 08:51
  • C'est le e qui est nul alors, pas le e.Button

    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 23 mars 2012 09:22
  •  

    Bonjour, Richard Clark,

    Merci pour votre feedback concernant la coloration syntaxique, mais vu que dans le menu Outils>Options>Polices et couleurs de VS 2010 on peut changer les couleurs par défaut de l’éditeur de texte, je crois qu’on ne peut pas dire que la coloration est mauvaise. Mais bon… je suis d’accord que le choix de la coloration syntaxique n’est pas très inspiré. J

    Bonne journée,

    Cipri


    vendredi 23 mars 2012 10:06
  • ?

    Je parle de la coloration syntaxique dans le forum qui n'est justement pas cohérent avec les couleurs par défaut dans VS.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 23 mars 2012 10:08
  • Et y'a pas de c à Clark ;-)))

    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 23 mars 2012 10:09
  •  

    Re-Bonjour,

    Ma faute (concernant le nom).

    Je parle aussi de la coloration syntaxique sur les forums… Pourquoi est-elle mauvaise si on n’a pas une seule coloration possible dans Visual Studio ? On peut définir les couleurs en Visual Studio, donc on peut aussi utiliser une autre coloration sur les forums. Mais je répète : je suis d’accord que le choix n’est pas inspiré.   

    Bonne journée,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    vendredi 23 mars 2012 10:13