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

Lazarus Pascal Discussion :

Gestion des erreurs dans des classes et traduction des messages [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut Gestion des erreurs dans des classes et traduction des messages
    Bonsoir à tous,

    Pour gérer les erreurs nous avons le système avec les Exceptions dans mon cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if not Assigned(Result) then
       raise EInvalidImageFile.CreateFmt('Format de fichier non supporté (%s,%s)',
         [ext, 'GLZImageFile' + UpperCase(ext)]);
    En mode "debug" nous avons cette petite fenêtre :

    Nom : 2017-08-16_154213.jpg
Affichages : 577
Taille : 25,0 Ko

    et en mode "Conception" nous avons celle-ci :

    Nom : 2017-08-17_222843.jpg
Affichages : 594
Taille : 14,2 Ko

    Ce n'est pas le mode débug qui me pose problème, mais à la conception

    Par exemple dans mon programme pour charger un fichier j'ai la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TMainForm.FormDropFiles(Sender: TObject;const FileNames: array of String);
    begin
       BmpFileName := FileNames[0];
       Screen.Cursor:=crHourGlass;
       ImageView1.Picture.LoadFromFile(BmpFileName); // ---> L'EXCEPTION EST LEVEE DANS CETTE PROCEDURE
       Screen.Cursor:=crDefault;
       lblBmpName.Caption:=BmpFileName;
       IsUpdated:=True;
       ImageView1.Invalidate;
    end;
    Dans ce cas l'exception fait irrémédiablement sortir de la procedure et Screen.Cursor n'est pas exécuté.

    J'ai également testé ça : (même si il faut rajouter les unités Forms et Controls dans le Uses de l'implementation )

    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
     
    function TGLZImageFileFormatsList.FindFromFileName(const fileName: string): TGLZBitmapClass;
    var
     ext: string;
     Screen : TScreen = nil;
    begin
     ext := ExtractFileExt(Filename);
     System.Delete(ext, 1, 1);
     Result := FindExt(ext);
     if not Assigned(Result) then
     begin
       raise EInvalidImageFile.CreateFmt('Format de fichier non supporté (%s,%s)', [ext, 'GLZImageFile' + UpperCase(ext)]);
       Screen.Cursor:=crDefault;
     end;
    end;
    Idem :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Screen.Cursor:=crDefault;
    n'est pas exécuté.

    Le plus simple serait que ma fonction retourne un boolean, mais dans ce cas il faudrait que toute (une majorité retourne un boolean) et dans dans certain cas ce n'est pas faisable.

    Donc, concernant les exceptions :
    • Existe-t-il une autre façon de procéder pour avoir plus de contrôles ?
    • Faut-il se passer des exceptions et gérer soit même ce genre d'erreur afin de ne pas perturber le bon fonctionnement d'un programme ?
    • Faut-il utiliser les exceptions que dans des cas "Critiques" (Acces dans un pointer par exemple) ?


    En gros quel serai le meilleur chemin à suivre ?

    Concernant la traduction

    • Peux-t-on intégrer des fichiers "PO" pour la traductions des divers messages. Et lier ceux-ci à une unité ou bien un paquet de conception ? si oui comment faire marcher tout ce petit monde au pas ?
    • La procédure à suivre est-t-elle la même que pour traduire une application ?


    Merci

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 166
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 166
    Par défaut
    Salut,

    As-tu tenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Result := FindExt(ext);
     if not Assigned(Result) then
     begin
       Screen.Cursor:=crDefault;
       Application.ProcessMessages; // pour que l'instruction précédente soit exécutée
       raise EInvalidImageFile.CreateFmt('Format de fichier non supporté (%s,%s)', [ext, 'GLZImageFile' + UpperCase(ext)]);
     end;
    ?

  3. #3
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Salut,

    As-tu tenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Result := FindExt(ext);
     if not Assigned(Result) then
     begin
       Screen.Cursor:=crDefault;
       Application.ProcessMessages; // pour que l'instruction précédente soit exécutée
       raise EInvalidImageFile.CreateFmt('Format de fichier non supporté (%s,%s)', [ext, 'GLZImageFile' + UpperCase(ext)]);
     end;
    ?
    Non, mais maintenant oui et un bon gros SIGSEGV ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {------------------------------------------------------------------------------
      procedure TScreen.SetCursor(const AValue: TCursor);
     ------------------------------------------------------------------------------}
    procedure TScreen.SetCursor(const AValue: TCursor);
    begin
      if AValue <> Cursor then -->Paf dans les dents
    Franchement de devoir faire un truc dans le genre ne m'emballe pas. Devoirs ajouter des unités servant à des contrôles graphique dans une unité ne les utilisant pas, c'est pas vraiment le top.

    Par contre un système de gestion d'erreur avec plusieurs niveau de sévérité, et qui réagirait en fonction de ce niveau. Serai nettement mieux (Un peu comme je fait en PHP en gros )

    Faut-t-il donc que je code ma propre classe de gestion d'erreur et l'utiliser comme un pont avec des exceptions (1 par niveau) et utiliser une jolie fonction du nom de Invoke(Level,Message) ?

    Un truc dans le genre, vite fait
    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
     
    Type
      ENoticeError = class(Exception);    // Exception Ou pas ??? affichage avec "ShowMessage" ? Ecriture dans un log ? Les 2 ?
      EWarningError = class(Exception); // Ideml ci-dessus
      ECriticalError = class(Exception);
      EFatalError = class(Exception);
     
    Type
      TErrorLevel = (elNone, elInfo,  elNotice, elWarning, elCritical, elFatal);
     
    Type
      TErrorHandler = class
      private
         FList : TErrorList;
      public
        function Add(Level, Msg); : Integer;
        Function Invoque(Const Level : TErrorLevel; Msg : String);
        Function Invoque(Const ErrorIndex : Integer);
     
      end;
     
    // Variable globale, initialiser dans la partie Initialization de l'unité
    Var
      ErrorManager : TErrorHandler;
    Vous en pensez quoi ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 252
    Par défaut
    hello,
    Question bête : Pourquoi n'utilises-tu pas un try ... finally comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    begin
       try
         BmpFileName := 'FauxFichier.bmp';
         Screen.Cursor:=crHourGlass;
         ImageView1.Picture.LoadFromFile(BmpFileName); // ---> L'EXCEPTION EST LEVEE DANS CETTE PROCEDURE
         lblBmpName.Caption:=BmpFileName;
         IsUpdated:=True;
         ImageView1.Invalidate;
       finally
         Screen.Cursor:=crDefault;
       end;
    end;
    Ami calmant, J.P (santé)

  5. #5
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    Question bête : Pourquoi n'utilises-tu pas un try ... finally comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    begin
       try
         BmpFileName := 'FauxFichier.bmp';
         Screen.Cursor:=crHourGlass;
         ImageView1.Picture.LoadFromFile(BmpFileName); // ---> L'EXCEPTION EST LEVEE DANS CETTE PROCEDURE
         lblBmpName.Caption:=BmpFileName;
         IsUpdated:=True;
         ImageView1.Invalidate;
       finally
         Screen.Cursor:=crDefault;
       end;
    end;
    Ami calmant, J.P (santé)
    Que je suis c... ! C'était tellement simple que je n'y avais pas pensé. Oui comme ça cela fonctionne pour ce cas. Masi je lève d'autres exceptions ailleurs, et ou appliquer un bloque Try..Finally est beacoup moins aisé.
    De même ici par exemple l'erreur en elle même n'est pas "grave" je la classerai dans "Notice" ou "Warning" le choix "Ok" de la boite de dialogue est quelque peu "Agressif" je trouve dans ce cas. Est -t-il possible de personnaliser la boite de dialogue d'erreur ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Salut BM.

    Tu peux insérer un bloc try..except dans le bloc try..finally.

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      A, B: integer;
    begin
      A:= 100;
      B:= 0;
      try
         try
           A:= A div B;
         except
           Showmessage('division par zéro');
         end;
      finally
        Showmessage('finally');
      end;
    end;
    Ainsi le message classique d'exception n'apparaitra pas.
    Ceci ne marche qu'en mode exécution hors Lazarus, sauf à interdire les messages d'exception dans le bloc try..except (possible sous Delphi7, jamais tenté sous Lazarus).

    Cordialement
    Thierry

  7. #7
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Je viens d'effectuer quelques recherches, j'ai trouvé quelques liens intéressant que je partage avec vous dans un premier temps.
    La plupart c'est pour Delphi. Mais bon. La base, du pascal reste du pascal.

    En français :
    - https://eric.univ-lyon2.fr/~ricco/co...rs_delphi.html Plein de liens intéressants
    - https://delphi.developpez.com/cours/...n-des-erreurs/
    - http://flash-koti.developpez.com/art...tionexception/ et
    http://fbeaulieu.developpez.com/guide/?page=page_19. Ca c'est plus ce que je recherche. Je vais testé.
    - https://www.gladir.com/CODER/DELPHI/exception.htm
    - https://www.gladir.com/CODER/FREEPASCAL/exception.htm
    - http://delphipage.free.fr/exceptions.html

    En anglais

    - http://stevepeacocke.blogspot.ch/200...ptfinally.html

    Donc le mieux, si j'ai pigé le truc, serait :

    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
     
    begin
       Try
         Screen.Cursor:=crHourGlass;
         Try
           BmpFileName := FileNames[0];
           ImageView1.Picture.LoadFromFile(BmpFileName);
         Finally
           Screen.Cursor:=crDefault;
           lblBmpName.Caption:=BmpFileName;
           IsUpdated:=True;
           ImageView1.Invalidate;
         end;
       Except
         On E : EInvalidImageFile do
         begin
           Screen.Cursor:=crDefault;
           MessageDlg(E.Message, mtWarning, [mbOk], 0);
         end;
         else MessageDlg('Erreur Inconnue : '+
          #13+#10+'Ok pour continuer'+#13+#10+'Abandonner pour quitter l''application', mtError, [mbOk, mbAbort], 0);
       end;
    end;
    Bon je vais creusé un peu plus.
    Sinon une des solution serai que je passe par le composant TApplicationProperties.OnException. Mais savez vous si il existe un moyen "externe" sans utiliser ce composant ?

    EDIT : Salut et merci Thierry, nos message se sont croisés

    REEDIT : Petites questions subsidiaires. Le code ci-dessus fonctionne mais la bonne formule c'est pas plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     try
             try
                  ....
                 On Except....
             end;
         Finally
            .....
        end;
    Y a-t-il une différence de mettre Finally après except vu que d'après ce que j'ai lu Finally propage l'exception levée ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

Discussions similaires

  1. Gestion d'erreurs dans une classe
    Par a028762 dans le forum Langage
    Réponses: 4
    Dernier message: 10/12/2011, 11h50
  2. Gestion des erreurs dans une classe
    Par gregb34 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 26/07/2007, 09h59
  3. Réponses: 3
    Dernier message: 21/10/2006, 22h46
  4. Gestion des erreurs dans un TRIGGER
    Par SDU64 dans le forum DB2
    Réponses: 1
    Dernier message: 18/05/2006, 09h51
  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