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

Bases de données Delphi Discussion :

Controler des erreurs dans un thread en éxécution


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Controler des erreurs dans un thread en éxécution
    Bonjour à tous,

    Je souhaite savoir comment faire pour que l'éxécution de mon programme ne s'arrête pas à la suite d'une erreur dans un thread.

    En effet, j'ai dans un thread un traitement qui se fait sur un ensemble de données dans une table. Certaines données sont mal formater et génère des erreurs lors du traitement ce qui a pour consequence d'arrêter le programme or je voudrais que celui-ci continue malgré tout à traiter les données suivantes.

    Pour essayer de résoudre ce problème, j'ai placé les instructions de traitement comme suit:

    1-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
         traitement()
       except
         Abort;
       end;
    sans succès...

    Puis

    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try
         traitement()
       except
       end;
    sans succès...

    et enfin,

    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try
         traitement()
       except
          On E:exception do
               Trait_Erreur(E.message); 
       end;
    Toujours sans succès...

    Si cela peut servir, dans "Traitement()" il y a l'écution d'un TQuery...

    Comment controler des erreurs dans un thread afin d'éviter le plantage d'un programme?

    Merci d'avance.
    Hagler.

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    En fait ton problème vient du fait que l'erreur se passe surement dans ton traitement().

    Au niveau de ton/tes Query/s , il faudrait que tu mettes aussi des Try...except... end, mais il te faut aussi rajouter le renvoi de l'erreur un cran au dessus sinon elle ne sera traiter que par ta procédure/fonction et vu que tu ne l'as protège pas avec des try...except, ca te bloque avec un message d'erreur.

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure Traitement();
    begin
      With TQuery do
      try
        // la requete
        Open;
      Except on E:Exception do
        // raise va renvoyer l'erreur un cran au dessus
        raise E.Create('L''erreur vient de traitement() et c''est ' + E.Message); 
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Merci pour cette reponse...

    Citation Envoyé par Rayek Voir le message
    En fait ton problème vient du fait que l'erreur se passe surement dans ton traitement().

    Au niveau de ton/tes Query/s , il faudrait que tu mettes aussi des Try...except... end, mais il te faut aussi rajouter le renvoi de l'erreur un cran
    au dessus sinon elle ne sera traiter que par ta procédure/fonction
    Dois-je écrire une fonction pour la traiter à ce niveau sachant que ce niveau pour moi est le thread principal du programme et l'utilisateur n'a pas besoin d'être informé du message?

    Citation Envoyé par Rayek Voir le message
    et vu que tu ne l'as protège pas avec des try...except, ca te bloque avec un message d'erreur.
    En fait le traitement se limite à ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      try
        Query.Close;
        Query.Clear;
        Query.Add(Req);
        Query.Open;
     except
     end;
    Cela s'exécute dans un thread.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Premiere chose, évite de répondre dans un Quote, c'est illisible ^^

    2em chose :

    Regarde bien le code ci dessous

    Code delphi : 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
     
    type TonThread = class(TThread)
      private
        procedure Traitement;
      public
        procedure Execute;override;
      end;
     
    implementation
     
    procedure TonThread.Traitement;
    begin
     With TQuery do
      try
        // la requete
        Open;
      Except on E:Exception do
        raise E.Create('L''erreur vient de traitement() et c''est ' + E.Message); 
      end;
    end;
     
    procedure TonThread.execute;
    begin
      // traitement divers 
      try
        Traitement;
      Except on E:Exception do
        // la tu fais ce que tu veux (enregistrement dans un fichier logs)
        // affichage dans un composant
        // etc ....
      end;
    end;

    De cette manière s'il y a une erreur dans Traitement, elle sera répercutée vers l'exception du execute du thread.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par hagler Voir le message
    Merci pour cette reponse...

    En fait le traitement se limite à ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      try
        Query.Close;
        Query.Clear;
        Query.Add(Req);
        Query.Open;
     except
     end;
    Cela s'exécute dans un thread.
    Si tu veux rebalancer l'erreur au thread principal, il a plein de manières de faire cela. En voici deux :

    1 -> Une propriété du thread, du style "Success", basculée à True/False dans ton code, et contrôlée par ton thread principal. Ca marche typiquement très bien si le thread principal attends le thread secondaire et que celui ci n'utilise pas FreeOnTerminate.

    2 -> Un callback transmis au thread :

    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
    type 
      TDBThreadErrorEvent = procedure (const AMessage: string; .....);
     
    TDbThread = class (TThread)
    private:
      FCallback: TDBThreadErrorEvent;
      ...
    public
      constructor Create(...; ACallback: TDBThreadErrorEvent);
    end;
     
    constructor TDbThread.Create(...; ACallback: TDBThreadErrorEvent)
    begin
      ...
      FCallback := ACallBack;
    end;
     
    procedure TDbThread.Execute()
    begin
      try
      except
        on E: Exception do //Appeller la méthode d'erreur
          if Assigned(FCallback)
            FCallback(E.Message, ...autres paramètres...);
        end;
      end;
    end;
    Maintenant, dans ton form principal, tu crées une méthode de type TDBThreadErrorEvent qui peut faire ce qu'elle veut avec l'erreur et tu la passes dans le constructeur de ton thread.

    Petit inconvénient : la fonction de rappel sera appelée dans le contexte du thread secondaire, donc pas d'appels à la VCL; ou bien un Synchronize() avant...
    "It's more fun to compute !"

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

Discussions similaires

  1. Controler des textBox dans des thread
    Par ramaro dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/04/2008, 14h21
  2. Validation , controle des erreurs dans la jsp.
    Par kalurar dans le forum Struts 2
    Réponses: 2
    Dernier message: 13/08/2007, 15h33
  3. [3.0.2]Détection des erreurs dans le Package Explorer
    Par willowII dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 18/08/2005, 18h46
  4. catch des erreurs dans SQL+
    Par lalystar dans le forum Oracle
    Réponses: 2
    Dernier message: 21/09/2004, 15h17
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20

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