IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[NullReferenceException] propager l'exception ?


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut [NullReferenceException] propager l'exception ?
    Bonjour,

    J'ai une class qui possède une méthode static, qui peut renvoyer un objet sans référence !

    Mon problème : La suite du code essaie par une propriété de récupérer une valeur (get) alors que l'objet n'est pas créé. A chaque fois j'obtiens donc l'Exception NullReferenceException.

    Je ne vois pas comment réussir à gerer proprement cette Exception ?!

    J'aimerai propager l'Exception à l'appelant. (Dans mon cas, il y a 4 niveaux de propagation), pour l'obliger a utiliser un Try...Catch

    Merci

    Dossier d;
    if (dt.Count != 0)
    {
    d = new Dossier(dt[0]);
    }
    else
    {
    d = null;
    throw new NullReferenceException("Aucun dossier ne correspond au code sinistre " + codeSinistre);
    }
    return d; // L'exception NullReferenceException n'a pas été géréé par le code utilisateur

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    throw ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(monobj == null) {
       throw new ArgumentNullException();
    } else {
       ...
    }
    normalement, l'exception remonte jusqu'à ce qu'un try ... catch l'intercepte.

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    throw ?
    Oui, throw... mais est-ce qu'une méthode static qui doit renvoyer un objet (de type Dossier dans mon cas) peut renvoyé une référence null ? Et comment la propager (voir code 1er messsage) correctement ?

    Merci

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Tu peux aussi ne faire un throw que dans ta dernière couche et vérifier dans les autres uniquement que monobj == null.

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    Tu peux aussi ne faire un throw que dans ta dernière couche et vérifier dans les autres uniquement que monobj == null.
    J'essaie ça tout de suite...

    Citation Envoyé par Kaidan Voir le message
    throw ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(monobj == null) {
       throw new ArgumentNullException();
    } else {
       ...
    }
    normalement, l'exception remonte jusqu'à ce qu'un try ... catch l'intercepte.
    => if (monobj == null) => utilisation d'une variable locale non assigné !
    En fait, ma classe ne dispose pas de constructeur par défaut. Je rempli mon objet avec une ligne (row) en base avec la methode GetDossier(ID), mais s'il n'y a aucune ligne trouvé je ne peux pas créé mon objet... Conceptuellement je penses qu'on peut trouver une autre solution que propager l'Exception.
    Mon problème, c'est que la méthode doit renvoyer un objet et qu'il peut ne pas avoir de référence (même pas null).

    édit: Dans le code de niveau le plus haut, si j'entoure tout par un Try...Catch ça fonctionne bien, et j'aimerai obliger le développeur à entourer le code d'un Try...Catch.
    En fait, mon objet peut être accessible par une propriété de l'objet au niveau supérieur

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Ticoche Voir le message
    => if (monobj == null) => utilisation d'une variable locale non assigné !
    En fait, ma classe ne dispose pas de constructeur par défaut. Je rempli mon objet avec une ligne (row) en base avec la methode GetDossier(ID), mais s'il n'y a aucune ligne trouvé je ne peux pas créé mon objet... Conceptuellement je penses qu'on peut trouver une autre solution que propager l'Exception.
    C'est pour le moins confus

    Pourquoi veux tu obliger les couches supérieures à gérer un try/catch plutôt que tester le retour ? je ne comprends pas (ou alors je pressens que tu veux utiliser cette conception java avec le mot clef "throws" qui force la procédure appelante à gérer l'exception - ce concept est tout à fait spécifique à Java et n'a pas à être pris en compte dans ton design de classe en .net).

    Si tu ne veux pas "bloquer" la création de l'objet en lançant une exception au niveau du constructeur (procédure assez normale), pourquoi ne procède tu pas à l'instanciation via une factory dans laquelle tu testerais les paramètres et qui renverrais null si paramètres non corrects ? (si j'ai bien compris ton besoin, qui n'est quand même pas très clair).

  7. #7
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    1er niveau (plus bas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
            public static Dossier GetDossierByCodeSinistre(decimal codeSinistre)
            {
                using (OdbcConnection cnx = new OdbcConnection("DSN=***;UID=***;PWD=***;"))
                {
                    using (DossierTableAdapter adapt = new DossierTableAdapter())
                    {
                        DataSetDossier.DossierDataTable dt = adapt.GetDossierByCodeSinistre(codeSinistre);
                        Dossier d = null;
                        if (dt.Count != 0)
                        {
                            d = new Dossier(dt[0]);
                        }
                        else
                        {
                            throw new NullReferenceException("Aucun dossier ne correspond au code sinistre " + codeSinistre);
                        }
                        return d;
                    }
                }
            }
    (L'utilisateur n'a pas géré l'Exception, et je vois mon message)

    2eme niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            public OngletDossier(decimal codeSinistre)
            {
                try
                {
                    this.d = Dossier.GetDossierByCodeSinistre(codeSinistre);
                }
                catch (NullReferenceException e)
                {
                    throw e;
                }  
            }
    (on ne passe pas dans le Catch...)

    3eme niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            public OngletDossier Dossier
            {
                get { return this.oglDossier; }
                set { this.oglDossier = value; }
            }
    4eme niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            private void initDossier()
            {
                {
                    chkDossierARelancer.Checked = ong.Dossier.ARelancer;
    ...
    ---
    J'arrive pas à propager mon Exception...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Propagation d'exceptions vers l'IHM
    Par Leniouns dans le forum Général Java
    Réponses: 2
    Dernier message: 25/04/2012, 14h14
  2. Propagation des exceptions
    Par GPZ{^_^} dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2009, 12h20
  3. Propager une exception
    Par ploxien dans le forum Langage
    Réponses: 3
    Dernier message: 10/10/2007, 15h55
  4. [Exception] Propagation des exceptions
    Par Rayek dans le forum Langage
    Réponses: 5
    Dernier message: 03/08/2007, 16h59
  5. [C# 1.1] Comment propager l'exception ?
    Par Monstros Velu dans le forum C#
    Réponses: 3
    Dernier message: 17/06/2006, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo