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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    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 éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    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 éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    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
    Membre Expert
    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
    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 éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    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

+ 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