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

Langage Delphi Discussion :

Exception sur le FormCreate d'une fiche


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut Exception sur le FormCreate d'une fiche
    Bonjour,

    Lorsqu'une exception est soulevée dans l'événement FormCreate d'un objet de type TForm, l'erreur est affichée à l'écran mais ne semble pas interrompre le déroulement du code. Voici un exemple.

    J'ai une fiche bidon dans laquelle je soulève une exception dans le FormCreate:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    unit Unit3;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
     
    type
      TForm3 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form3: TForm3;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm3.FormCreate(Sender: TObject);
    begin
       raise Exception.Create('Voici une erreur');
       Showmessage('Ce message n''est jamais affiché');
    end;
     
    end.
    Dans une autre fiche, sur le clic d'un bouton, je créé une instance de TForm3 :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, AppEvnts, Buttons;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
      Ttesss = class
       constructor Create;
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses Unit2, Unit3;
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
       F: TForm3;
     
    begin
       F := TForm3.Create(self);
       showmessage('Ce message est affiché');  //Pourquoi est-ce que ça exécute ce code??
    end;
     
    end.
    Lorsque je clique sur Button1, l'erreur est affichée et quand je fais OK, le showmessage est exécuté.

    Ma question est fort simple : pourquoi est-ce que le code de Button1Click continue d'être exécuté après qu'une exception a été soulevée ?

    Merci!

  2. #2
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Parce qu'elle est attrapée dans Application.OnException.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Parce qu'elle est attrapée dans Application.OnException.

    Merci pour la réponse!

    Pourquoi celle-là plus qu'une autre ? Comment m'est-il possible m'assurer que mon code ne soit plus traité après que l'erreur soit soulevée ?

    Merci encore!

  4. #4
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Ben lis l'aide de TApplication.OnException. Elle pas plus qu'une autre : toutes les exceptions sont attrapées dans le OnException par défaut.

    Il faut donc écrire un autre OnException.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Par défaut
    Salut,

    Je rajoute mon grain de sel :

    Ca ne me surprend pas que l'exception soit rattrapée par le Application.OnException, et que l'application continue de tourner. Par contre, comme SlimJoe, ça me semble bizarre que l'exception levée au milieu de la fonction "TForm1.Button1Click" soit rattrapée avant la fin de Button1Click. On aurait pu s'attendre à ce que l'erreur créée par "TForm3.Create" interrompe l'exécution de la fonction "Button1Click" - et que le "ShowMessage('Ce message est affiché');" ne soit pas exécuté.

    Comme élément de réponse : quand tu crées une Form définie par un dfm, Delphi fait tout un micmac. Il crée dynamiquement un objet, chargé de parser le contenu du dfm (au moment de l'exécution, il n'y a plus de .dfm, j'imagine qu'il copie d'une manière ou d'une autre le contenu du .dfm comme une ressource du .exe), et de créer puis initialiser les composants en fonction de ce qu'il lit.
    Ce mécanisme est loin d'être simple, et peut provoquer des erreurs(*). Pour éviter que ces erreurs ne cassent tout le fonctionnement du programme, je pense que Delphi colle automatiquement un "Try.. Except..." autour de tout ce bordel, et que c'est ce Try Except qui rattrape l'exception.

    Je n'ai pas encore pris le temps de vérifier ; tu peux vérifier l'état de la pile d'appel avec le débugger au moment où ton exceptiuon est levée. Je suis prêt à parier une papillotte que c'est un truc du genre.

    *LeGEC*

    (*)Un exemple d'erreur : j'ai créé une fiche, coller un bouton, avec un évènement OnClick depuis le dfm, puis, dans le .pas, j'ai passé la callback ButtonClick dans la partie "protected" de la classe Form. Ce truc passe à la compilation, par contre, à l'exécution, mon programme levait une exception qui disait "je n'arrive pas à trouver la fonction ButtonClick". Cela veut dire que dans l'exe produit, Delphi parcourt la description de la classe à chaque fois qu'il veut créer une Form de la classe considérée, alors que le compilateur ne prévient pas qu'il faut que la méthode soit publiée...

  6. #6
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    J'ai testé ces deux cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    constructor TForm2.Create(AOwner: TComponent);
    begin
      inherited;
    //  raise Exception.Create('exception');
    //  ShowMessage('ap except');
    end;
     
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      raise Exception.Create('exception');
      ShowMessage('ap except');
    end;
    Dans le cas du constructeur, l'exception est bien levée et propagée, mais pas dans le cas de l'événement OnCreate, elle n'est pas propagée en dehors de l'événement.

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

Discussions similaires

  1. [À télécharger] Action sur la transparence d'une fiche
    Par pottiez dans le forum Téléchargez
    Réponses: 0
    Dernier message: 10/11/2010, 09h31
  2. Réponses: 1
    Dernier message: 12/12/2008, 08h57
  3. Avis sur la vérification des données d'une fiche
    Par AlexB59 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 28/07/2005, 20h55
  4. Réponses: 5
    Dernier message: 07/07/2005, 10h20
  5. Réponses: 2
    Dernier message: 19/08/2003, 15h45

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