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

VB.NET Discussion :

Try..Catch fonctionne dans New mais pas dans Load [Débutant]


Sujet :

VB.NET

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut Try..Catch fonctionne dans New mais pas dans Load
    Bonjour à tous

    Dans une feuille MDI, plusieurs forms sont appelées de la manière suivante :
    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
    Dim MaForm As frmForm = Nothing
    Try
        MaForm = New frmForm
        MaForm.MdiParent = Me
     
        MaForm.EcranAppelant = Me.Name
     
        m_ChildFormNumber += 1
     
        MaForm.Show()
     
    Catch Ex As Exception
        MessageBox.Show(Ex.Message, "Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Error)
        If MaForm IsNot Nothing Then MaForm.Dispose() : MaForm = Nothing
    End Try
    Dans chaque form appelée, il y a du code dans le NEW et du code dans le LOAD qui exécute des actions spécifiques en fonction de la form appelante.

    Voici la structure du code du NEW :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    InitializeComponent()
    Partie A = code dont je ne veux pas gérer les erreurs dans le new
    ....
    Try
        Partie B = erreurs fonctionnelles que je veux gérer
    Catch Ex As Exception
        Throw New Exception(Ex.Message)
    End Try
    Dans le NEW, toute erreur, même une erreur que je déclenche volontairement pour tester dans la partie A, se retrouve catchée par le bloc Try de la MDI. Fonctionnement normal.
    Cela fonctionne donc bien quand une erreur se produit dans le NEW.

    Mais quand une erreur se produit dans le LOAD, une exception non gérée se produit.
    Une exception non gérée du type 'System.Exception' s'est produite
    Si je mets un bloc Try, je peux afficher le message mais si je veux propager l'erreur pour qu'elle revienne dans la bloc Try de la MDI, j'ai une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' Dans le Load :
    ...
    Try
       ...
    Catch Ex As Exception
        MessageBox.Show(Ex.Message) ' => j'ai bien le message de l'erreur qui s'affiche dans la MessageBox
        Throw New Exception(Ex.Message) ' => plantage avec le message "Une exception non gérée du type 'System.Exception' s'est produite"
    End Try
    Je ne comprends pas. Comment cela se fait-il ?

    Merci de votre aide.

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Je continue de tester pour essayer de comprendre. Et plus ça va, moins je comprends

    J'ai déplacé le code contenu dans le LOAD (sans le modifier) pour le mettre dans le NEW (il n'y a donc plus rien dans le LOAD). Ca marche : l'erreur est bien propagée jusqu'au CATCH de la MDI qui affiche le MESSAGEBOX. Ce même code quand il est dans la partie LOAD ne propage rien et finie en "exception non gérée"

    J'ai fait le test inverse : j'ai déplacé le code du NEW dans le LOAD (plus rien ne reste donc dans le NEW) et rien ne marche. Les erreurs bien récupérées par la MDI lorsque le code était dans le NEW ne sont plus récupérées et finissent en "exception non gérée" maintenant que le même code est dans le LOAD.
    Et bien sûr, les erreurs qui n'étaient pas récupérées avant dans le LOAD, ne le sont toujours pas.

    Je suis perdu.

    Bien sur, je pourrais adapter le code pour tout mettre dans la partie NEW. Mais je voudrais comprendre.

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pas lu, mais c'est un bug connu, les exceptions dans l'event form.load (au moins en x64) sont interceptées (par le framework surement)
    il faut donc faire autrement

    après ca reste logique de gérer l'initialisation dans le new (ce qui évite de créer une instance si ca plante) et de ne gérer que des effets d'affichage dans le load
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci Pol63
    Ta réponse me fait penser que je n'ai pas indiqué ma plateforme : Win7 x64 + VB 2012 + Framework 4.5
    Donc je tombe dans le bug connu

    Si je veux laisser uniquement l'initialisation dans le New, je peux mettre les effets d'affichage dans quel événement qui ne possède pas le bug pour remplacer le Load ? Dans Activate ?

  5. #5
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Hobbi1 Voir le message
    Merci Pol63
    Ta réponse me fait penser que je n'ai pas indiqué ma plateforme : Win7 x64 + VB 2012 + Framework 4.5
    Donc je tombe dans le bug connu

    Si je veux laisser uniquement l'initialisation dans le New, je peux mettre les effets d'affichage dans quel événement qui ne possède pas le bug pour remplacer le Load ? Dans Activate ?
    Bonjour,

    Nous ne possédons pas tout les tenants et aboutissant mais ce qui me chagrine c'est de voir ce genre de chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Try
    '....
    '.......
    Catch Ex As Exception
        MessageBox.Show(Ex.Message, "Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Error)
        If MaForm IsNot Nothing Then MaForm.Dispose() : MaForm = Nothing
    End Try
    Une clause serait bien mieux adaptée pour disposer un objet !

    NB : Il existe des cas particuliers ou des propriétés d'instance peuvent retourner des exceptions lors d'une initialisation mais dans ton cas je reste perplexe sur le fait qu'une erreur soit retournée, il doit y avoir quelque chose ailleurs dans ton code qui pose problème !

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Oui wallace1, tout à fait d'accord pour le finally
    Je l'utilise pour les forms que lorsque j'utilise l'affichage avec ShowDialog
    Mais comme dans le cas présent j'utilise Show, la form serait "disposée" avant même que l'utilisateur l'a voit

    Je continue à faire mes tests

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    C'est un détail mais attention aussi que pour renvoyer une erreur, il suffit d'écrire Throw et pas Throw New Exception(Ex.Message).

    En faisant comme vous faites, vous perdez la valeur de la propriété stacktrace il me semble (sûr à 90%).

    Puis de toute façon, c'est moins long d'écrire Throw (ça devrait suffire comme raison ^^)
    Kropernic

  8. #8
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Oui merci Kropernic
    C'est plus une erreur dans mon exemple. J'utilise généralement le Throw New quand c'est une erreur que je gère, que je déclenche

  9. #9
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Alors tout va bien
    Kropernic

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Lorsque wallace1 dit :
    il doit y avoir quelque chose ailleurs dans ton code qui pose problème !
    Je veux bien. Je suis humain et pas un expert en VB.Net
    Mais je ne comprends pas, comme j'ai essayé de l'expliqué précédemment, pourquoi le code dans le NEW (et qui catch bien l'erreur) lorsqu'il est copié à l'identique dans le LOAD déclenche une exception non gérée.
    C'est le même code, et c'est la même erreur qui est déclenchée (je ne l'a corrige pas pour répéter les mêmes tests)

  11. #11
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    Met ton code dans une Methode et met la méthode dans load(),
    Fait deux try catch: un au niveau du methode; 2 au niveau du Load

  12. #12
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci
    Je vais tester ça dès que je le pourrais

  13. #13
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    @Hobbi : Here are the detailed explanations :

    http://blog.paulbetts.org/index.php/...ptions-in-x64/

    good reading...

    A+

  14. #14
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Evite le Throw dans un Load. (Il fonctionne bien dans ton new parce que c'est toi-même qui appelle ton constructeur dans le main, qui est entouré d'un Try/Catch)
    J'ai l'impression que l'endroit où est appelé le "Load" n'est pas contenu dans un Try/Catch.

    Personnellement, je ne "Throw" que si je suis sur de "Catch"
    "Hope for the best, but prepare for the worst."

  15. #15
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    J'ai remarqué que les exceptions apparaissant dans un load n'empêche pas l'ouverture de la fenêtre mais uniquement le traitement de ce qui suit dans l'événement load. Ce qui fait qu'on se retrouve souvent avec un formulaire "fini au pipi"...

    Donc si l'objectif est de prévenir l'ouverture de la fenêtre en cas d'erreur il faut mieux mettre un Me.Close() dans un try catch contenu dans l'événement load plutôt que d'envelopper le maForm.Show() avec un try catch et d'essayer de fermer la fenêtre depuis le code appelant son ouverture avec un maForm.Close().

    Après d'expérience, chaque procédure événementiel devrait être capable d'intercepter et de solder toutes les exceptions pouvant survenir lors de son exécution. En gros Chaque Sub avec un handle doit avoir un try catch qui englobe l'entier du code et ne renvoie pas la patate chaude plus loin.

  16. #16
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Citation Envoyé par sinople Voir le message
    il faut mieux mettre un Me.Close() dans un try catch contenu dans l'événement load
    Tu ne peux pas, il va te sortir grosso modo qu'il est impossible de fermer la form qui est en cours d'ouverture (dans les MDI).
    Je n'ai plus en tête l'erreur, mais je l'ai vue assez souvent ^^ Le plus simple est de faire maForm.Show() puis mettre un maForm.Init() où là tu auras ton Try/Catch et ton Me.Close() dans le Catch.

    Le Load sert à générer les contrôles, pas à initialiser les données !
    "Hope for the best, but prepare for the worst."

  17. #17
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Désolé de cette réponse tardive, mais j'ai été malade.
    Merci pour toutes vos réponses. J'ai tout lu, pas tout compris, notamment dans le lien de wallace1

    J'ai compris quel était le problème, corrigé grâce à vos remarques et suggestions et validé sur une Form. Il ne me reste plus qu'à repasser sur le code des autres Forms, au cas où.
    Merci à tous.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/10/2014, 16h58
  2. Requête fonctionnant sur ssms mais pas dans mon programme
    Par tumoo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2011, 14h49
  3. fonctionne sous eclipse mais pas dans un jar
    Par lionel.barrere dans le forum JPA
    Réponses: 3
    Dernier message: 28/01/2010, 14h48
  4. Réponses: 0
    Dernier message: 04/01/2008, 10h40

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