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 efficace des erreurs [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut Gestion efficace des erreurs
    Bonjour,

    je suis face à un sale problème (c'est la série...) : soit des fichier image parfois un peu mal fichus qui font crier mon programme ainsi que l'aperçu de l'OpenPictureDialog, donc c'est pas mon code, ouf !
    (Une histoire d'invalid pointer ou similaire, mais le fichier s'affiche pourtant bien avec d'autres outils, aussi bien sous XP que sous Debian...)

    Je me suis dit : tu vas blinder le truc avec un bloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try
      OuvertureFichier(filename);
    except
      ShowMessage('Ooops...');
      Ménage; // restauration du curseur d'origine, etc.
      Exit;
    end;
    Ça fonctionnerait mais il doit se passer des choses bizarres dans le code du composant utilisé car une fois le ménage fait, je ne peux pas ouvrir d'autres images, mon programme freeze,

    Qu'à cela ne tienne, j'ai donc décidé d'aller voir comment ça se passait dans le programme de démo fourni avec le compo mais là, c'est violent, je ne vois pas mon ShowMessage('Ooops...');, j'entraperçois pendant une fraction de seconde un message me parlant d'Access Violation puis le programme disparaît des écrans sans autre forme de procès...

    Conclusion : Try Except End n'est pas aussi performant et efficace qu'il y parait.
    Question : comment bien gérer ça ?

    Démo rapide :
    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
    function Calcul: double;
    var a,b: double;
    begin
      a := 5;
      b := 0;
      try
        result := a / b;
      except
        ShowMessage('Ooops...');
        result := 0;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(FloatToStr(Calcul));
    end;
    Au clic :
    Nom : showmessage_special.png
Affichages : 832
Taille : 7,2 Ko
    Pourquoi ne vois-je pas mon ShowMessage ?
    Pourquoi ne vois-je pas le ShowMessage principal avec le zéro que je force ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Bonjour Jipété !

    Ce n'est pas la réponse à ta question mais depuis peu j'ai pris l'habitude d'exécuter systématiquement mes programmes depuis l'invite de commandes, ce qui m'a permis de découvrir des bugs dont je ne m'étais jamais aperçu, dans des programmes que j'utilisais pourtant depuis longtemps.

    Chez moi, le programme suivant, compilé comme une application console, renvoie bien le "Ooops..." attendu :

    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
     
    uses
      SysUtils;
     
    function Calcul: double;
    var a,b: double;
    begin
      a := 5;
      b := 0;
      try
        result := a / b;
      except
        WriteLn('Ooops...');
        result := 0;
      end;
    end;
     
    begin
      Calcul;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    Je ne sais pas si c'est le cas, mais si vous testez votre programme dans l'IDE Lazarus, c'est "normal": il faut le lancer en dehors de l'IDE pour que les blocks "try/except/finally" fassent leur travail.

    Il y a de nombreux posts sur le forum Lazarus à ce sujet, car c'est un problème qui a été fréquemment évoqué: un des exemples, avec sa réponse http://forum.lazarus.freepascal.org/...html#msg130850


    PS. Vous pouvez -en théorie- agir sur cela au niveau de l'IDE en ajoutant éventuellement des exceptions (bien que je ne sois pas sûr que cela fonctionne dans tous les cas): cf. Outils -> Options -> Débogueur -> Exceptions de langage.

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Ce n'est pas la réponse à ta question mais depuis peu j'ai pris l'habitude d'exécuter systématiquement mes programmes depuis l'invite de commandes, ce qui m'a permis de découvrir des bugs dont je ne m'étais jamais aperçu, dans des programmes que j'utilisais pourtant depuis longtemps.

    Chez moi, le programme suivant, compilé comme une application console, renvoie bien le "Ooops..." attendu :
    Ce qui ne m'arrange pas, mais merci d'avoir amorcé la pompe à messages,

    Citation Envoyé par FChrisF Voir le message
    Je ne sais pas si c'est le cas, mais si vous testez votre programme dans l'IDE Lazarus, c'est "normal": il faut le lancer en dehors de l'IDE pour que les blocks "try/except/finally" fassent leur travail.
    Oui, mais ça je le sais, et j'ai donc bien fait attention à exécuter le petit prog de démo hors IDE et le résultat est bien conforme à la copie d'écran, "+inf" et c'est tout...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 410
    Points : 5 801
    Points
    5 801
    Par défaut
    salut

    Je préfère ce genre de code plutôt que des showmessage + menage
    Try

    ecxept
    raise Exception.Create('Test');
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Expert confirmé
    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
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut

    Tu as quoi dans ta procedure OuvertureFichier ?

    Je placerai plus le Try/Except dedans. Sauf si "OuvertureFicher lève elle même une exception avec Raise( EDIT : comme Anapurna vient de le dire ) :

    Code purement hypothétique :
    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
    function OuvertureFicher(fn:String):Boolean;
    begin
      Try
        Try
          Screen.Cursor := crHourGlass;
          ImageFileName := FileNames[0];
          ImageView.Picture.LoadFromFile(ImageFileName);
        Finally
          Screen.Cursor := crDefault;
          Result := true;
        End;
      Except
        On E: Exception Do
        Begin
          MessageDlg(E.Message, mtWarning, [mbOK], 0);
          Result := false;
          Exit;
        End;
      End;    
    end;
     
    Ok := OuvertureFichier(filename);
    if not(Ok) then
    begin
       Menage;
    end;
    • "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

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Tu as quoi dans ta procedure OuvertureFichier ?
    Tout le code du composant lecteur de gif. J'y retournerai quand j'y verrai plus clair avec les erreurs (il serait temps que je m'y mette...)

    Citation Envoyé par anapurna Voir le message
    je préfère ce genre de code plutôt que des showmessage + menage
    Oui, ça c'est bien pour se prémunir contre des erreurs envisageables, comme celle qu'on trouve dans l'aide à propos de "Raise" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function DoDiv (X,Y: Longint):Integer;
    begin
      If Y = 0 then
        Raise Exception.Create('Division*by*Zero*would*occur');
      Result := X Div Y;
    end;
     
    procedure TForm1.Button4Click(Sender: TObject);
    begin
      ShowMessage(IntToStr(DoDiv(5, 0)));
    end;
    Mais quand l'erreur est imprévue (un fichier mauvais dans un dossier) et qu'il y a des choses avant (changement de curseur, réservation de mémoire, etc.), c'est bien de faire le ménage si on veut pouvoir continuer avec les autres fichiers.
    Quant au ShowMessage, c'est pour avoir un texte bien customisé pour l'utilisateur final.


    Bon, enfin, tout ça est très compliqué et je n'ai pas la tête à ça ce soir...
    Je n'arrive pas à comprendre pourquoi mon bloc except
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      try
        result := a / b;
      except
        ShowMessage('Ooops...');
        result := 0;
      end;
    n'est pas appelé : j'ai beau lire l'aide (qui dit qu'il est appelé en cas d'exception), tout ce que j'ai c'est "+Inf" !


    Demain, je vais attentivement étudier cette page, et l'exemple de l'aide.

    Parce que, comme dit + haut, si mon bloc except n'est pas appelé lors d'une division par zéro, avec ce bout de code (inspiré de l'aide sur except) il est appelé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button5Click(Sender: TObject);
    var
      Z: integer;
    begin
      try
        Z:= DoDiv(5,0);
      except
    //    On Exception do begin
          ShowMessage('tite erreur');
          Z := 0;
    //    end;
      end;
      ShowMessage(IntToStr(Z));
    end;
    Le DoDiv c'est celui d'en haut du post, et j'ai l'impression que le bloc On Exception do begin... end est redondant avec le bloc except... end : la preuve, c'est commenté et j'ai le message.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Au clic :
    Nom : showmessage_special.png
Affichages : 832
Taille : 7,2 Ko
    Pourquoi ne vois-je pas mon ShowMessage ?
    Pourquoi ne vois-je pas le ShowMessage principal avec le zéro que je force ?
    comme indiqué dans le message a/b = +INF

    fait la même chose avec des Integer et "a div b" et tu auras ton exception
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Expert confirmé
    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
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Tout le code du composant lecteur de gif. J'y retournerai quand j'y verrai plus clair avec les erreurs (il serait temps que je m'y mette...)

    Je n'arrive pas à comprendre pourquoi mon bloc except
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      try
        result := a / b;
      except
        ShowMessage('Ooops...');
        result := 0;
      end;
    n'est pas appelé : j'ai beau lire l'aide (qui dit qu'il est appelé en cas d'exception), tout ce que j'ai c'est "+Inf" !
    Ce code fonctionne parfaitement sous Windows. N'oublis pas qu'il faut lancer ton projet en dehors de l'EDI pour voir ton "Ooops...". Si tu lances ton application depuis l'EDI le débugger intercepte l'exception AVANT et te renvois un jolie SIGFPE si b=0. Serait-ce donc un bug sous linux ?.

    Je lance ma machine Linux et je reviens
    • "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

  10. #10
    Expert confirmé
    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
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Je suis de retour sous Linux je te confirme tu n'es pas fou ! Tel quel ça ne marche pas aucune Exception est levée que ce soit dedans ou en dehors de L'EDI. Pourquoi ? j'ai fait une recherche rapide et je suis tombé la dessus : http://wiki.lazarus.freepascal.org/M...FPU_exceptions

    pour contourner le problème, avec les divisions par zero ou autres erreurs mathématique, il faut reaffecter les "mask" du FPU.

    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
    uses math;
     
    Procedure TForm1.Button1Click(Sender : TObject);
    Var
      Z :Double;
      FPUExceptionMask: TFPUExceptionMask;
    Begin
      try
        FPUExceptionMask := GetExceptionMask;
        SetExceptionMask(FPUExceptionMask - [exInvalidOp, exZeroDivide]);
        try
           Z := A / B;
     
        finally
          SetExceptionMask(FPUExceptionMask);
        end;
       except
         ShowMessage('Ooops...');
         Z := 0;
       end;
    end;
    Resultat lancement depuis l'EDI
    Nom : Screenshot_20180517_230919.png
Affichages : 543
Taille : 12,7 Ko

    En dehors :

    Nom : Screenshot_20180517_230748.png
Affichages : 530
Taille : 14,2 Ko
    • "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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Je suis de retour sous Linux je te confirme tu n'es pas fou ! Tel quel ça ne marche pas aucune Exception est levée que ce soit dedans ou en dehors de L'EDI. Pourquoi ? j'ai fait une recherche rapide et je suis tombé là-dessus : http://wiki.lazarus.freepascal.org/M...FPU_exceptions
    C'est vrai qu'il y a des jours je me pose des questions,



    Alors là mon gars, moi j'dis respect pour avoir trouvé ça !

    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    La chose qui m'ennuie considérablement, c'est le petit prog dans ton lien, que j'ai transposé pour l'avoir dans une IHM avec un TMemo pour voir les résultats, et je n'ai jamais le mot "not" !

    Le code (j'ai gardé en commentaire la ligne rajoutant si nécessaire le "not") :
    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
    procedure TForm1.Button6Click(Sender: TObject);
    var
      FPUException: TFPUException;
      FPUExceptionMask: TFPUExceptionMask;
      nom,ligne: Ansistring;
    begin
      FPUExceptionMask := GetExceptionMask;
      for FPUException := Low(TFPUException) to High(TFPUException) do begin
        ligne := '';
        WriteStr(nom, FPUException); // You can use WriteStr() to convert a enum to a string. -- reply #2 dans http://forum.lazarus.freepascal.org/index.php?topic=33819.0
        ligne := Format('%15s', [nom]) + ' - ';
        //if not (FPUException in FPUExceptionMask) then write('not ');
        if not (FPUException in FPUExceptionMask) then ligne := ligne + 'not ';
        ligne := ligne + 'masked!';
        memo1.Lines.Add(ligne);
      end;
    end;
    Le résultat (utilisez une police non proportionnelle genre Courier New) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        exInvalidOp - masked!
     exDenormalized - masked!
       exZeroDivide - masked!
         exOverflow - masked!
        exUnderflow - masked!
        exPrecision - masked!
    Désagréable, hein !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    Expert confirmé
    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
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    La chose qui m'ennuie considérablement, c'est le petit prog dans ton lien, que j'ai transposé pour l'avoir dans une IHM avec un TMemo pour voir les résultats, et je n'ai jamais le mot "not" !
    ...
    Désagréable, hein !
    Je n'ai pas testé. Mais c'est normal comme résultat, tu inverses les choses les Exceptions sont masquées donc elle ne sont pas gérées. Regardes : SetExceptionMask(FPUExceptionMask - [exInvalidOp, exZeroDivide]); ici on supprime le masquage justement

    Bon allez faudrait que je penses à aller me coucher.

    Bonne nuit
    • "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

  14. #14
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    tu inverses les choses les Exceptions sont masquées donc elle ne sont pas gérées.
    Je n'inverse rien du tout : je me contente de faire un copier/coller du code du wiki que j'adapte à une sortie vers TMemo...

    Et si j'ai bien compris le code, l'idée de départ c'est de lister celles qui sont masquées et celles qui ne le sont pas.

    Le plus curieux, c'est que si je crée un "programme simple" et que j'y colle les lignes du wiki, l'exécution donne le même résultat que le wiki !

    Je viens de faire un test en mode pas-à-pas dans l'IHM et le TMemo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      //if not (FPUException in FPUExceptionMask)
      //  then write('not ');
        if not (FPUException in FPUExceptionMask)
          then ligne := ligne + 'not ';
    Je ne passe jamais sur la ligne "then", et résultat aussi bad avec la 1.8.2, testé à l'instant.
    En haut le programme GUI et son (bout d') IHM et en bas le simple programme en console.

    Nom : exceptions.png
Affichages : 500
Taille : 10,4 Ko

    Voilà encore une journée qui commence bien...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    En fait (et comme bien souvent [je les hais pour ça, ]), la page wiki ne donne pas d'infos à propos de la version utilisée lors de sa rédaction.

    Manifestement il n'y a pas d'erreur dans mon adaptation de leur code, et en lisant ça
    Citation Envoyé par wiki
    However, with Gtk2, only exOverflow is not masked.
    j'en conclus que le code interne à Lazarus a évolué depuis la rédaction du wiki.

    Partant de là j'ai attentivement étudié l'exemple en bas de l'article et j'en arrive à ça, avec un TButton, un TEdit et un TCheckbox sur l'IHM :
    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
    procedure TForm1.Button7Click(Sender: TObject);
    var
      X, A, B: Double;
      FPUExceptionMask: TFPUExceptionMask;
    begin
      A := 5;
      if ckbxBegaleZero.Checked then B := 0 else B := 2;;
      try
        FPUExceptionMask := GetExceptionMask;
    //    SetExceptionMask(FPUExceptionMask - [exInvalidOp, exZeroDivide]); // ligne d'origine
        SetExceptionMask(FPUExceptionMask - [exInvalidOp, exZeroDivide, exOverflow]);
        try
          X := A / B; // First, we set auxiliary variable X
        finally
          SetExceptionMask(FPUExceptionMask);
        end;
        // code block 1
        ShowMessage('block 1');// vu avec B = 2
        Edit1.Text := FloatToStr(X); // Now we can set Edit's text.
      except
        // code block 2
        ShowMessage('block 2');// vu avec B = 0
        Edit1.Text := 'problème';
      end;
    end;
    Nom : test_wiki.gif
Affichages : 479
Taille : 11,1 Ko

    Voilà.
    À partir de là il devrait être facile de gérer proprement les erreurs.
    Plus qu'à adapter pour Windows.
    Merci à tous,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Plus qu'à adapter pour Windows.
    Bon, ben j'ai bricolé ça à la va-vite, et ça le fait, même si c'est pas très beau : dommage de ne pas pouvoir récupérer la valeur de LCLWidgetType, qui est pourtant définie dans les options du projet :

    Nom : lclwidgettype.png
Affichages : 709
Taille : 19,6 Ko

    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
    {$IFDEF LINUX}
    {$DEFINE gtk2} // penser à modifier si utilisation de Qt
    {$ENDIF}
     
    procedure TForm1.Button7Click(Sender: TObject);
    var
      X, A, B: Double;
      FPUExceptionMask: TFPUExceptionMask;
    begin
      A := 5;
      if ckbxBegaleZero.Checked then B := 0 else B := 2;;
      try
        {$IFDEF gtk2}
        FPUExceptionMask := GetExceptionMask;
    //    SetExceptionMask(FPUExceptionMask - [exInvalidOp, exZeroDivide]); // unmask
        SetExceptionMask(FPUExceptionMask - [exInvalidOp, exZeroDivide, exOverflow]); // unmask
        {$ENDIF}
        try
          X := A / B; // First, we set auxiliary variable X
        finally
          {$IFDEF gtk2}
          SetExceptionMask(FPUExceptionMask);// return previous masking immediately, we must not let Gtk2 internals to be called without the mask
          {$ENDIF}
        end;
    // la fin est inchangée
    Oui, le hack sous Linux n'est pas nécessaire sous Windows, c'est comme ça, c'est la vie des multi-plateformes,


    EDIT : si certains veulent s'en inspirer, ça m'a pris 30 secondes pour faire fonctionner le petit calcul du Button1 et avoir les messages qui m'intéressent et faire le ménage,
    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
    procedure TForm1.Button1Click(Sender: TObject);
      function Calcul_v2: double;
      var
        a,b,x: double;
        FPUExceptionMask: TFPUExceptionMask;
      begin
        {$IFDEF LINUX}
        {$DEFINE gtk2}
        {$ENDIF}
        a := 5;
        if ckbxBegaleZero.Checked then b := 0 else b := 2;;
        try
          {$IFDEF gtk2}
          FPUExceptionMask := GetExceptionMask;
          SetExceptionMask(FPUExceptionMask - [exInvalidOp, exZeroDivide, exOverflow]); // unmask
          {$ENDIF}
          try
            x := a / b; // First, we set auxiliary variable X
          finally
            {$IFDEF gtk2}
            SetExceptionMask(FPUExceptionMask);// return previous masking immediately, we must not let Gtk2 internals to be called without the mask
            {$ENDIF}
          end;
          // code block 1
          ShowMessage('ok');// vu avec B = 2
        except
          // code block 2
          ShowMessage('problème');// vu avec B = 0
          x := 0;
        end;
        result := x;
      end;
    begin
      ShowMessage(FloatToStr(Calcul_v2));
    end;
    /EDIT
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  17. #17
    Expert confirmé
    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
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut

    Citation Envoyé par Jipété Voir le message
    Bon, ben j'ai bricolé ça à la va-vite, et ça le fait, même si c'est pas très beau : dommage de ne pas pouvoir récupérer la valeur de LCLWidgetType, qui est pourtant définie dans les options du projet
    Les WidgetTypes correspondent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      {$IFDEF LCLGTK2}...{$ENDIF}
      {$IFDEF LCLGTK3}...{$ENDIF}
      {$IFDEF LCLQT4}...{$ENDIF}
      {$IFDEF LCLQT5}...{$ENDIF}
      {$IFDEF LCLCARBON}...{$ENDIF} 
      ect....
    Ces informations sont générées par macros, grâce aux options du paquet LCL --> Options du compilateur --> Macros de l'EDI
    et de l' éditeur des définitions de code (Menu Outils de l'EDI).
    • "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

  18. #18
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Les WidgetTypes correspondent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      {$IFDEF LCLGTK2}...{$ENDIF}
      {$IFDEF LCLGTK3}...{$ENDIF}
      {$IFDEF LCLQT4}...{$ENDIF}
      {$IFDEF LCLQT5}...{$ENDIF}
      {$IFDEF LCLCARBON}...{$ENDIF} 
      etc.
    Ces informations sont générées par macros, grâce aux options du paquet LCL --> Options du compilateur --> Macros de l'EDI
    et de l'éditeur des définitions de code (Menu Outils de l'EDI).
    Bien vu !
    Ça ne s'invente pas, ça ne se devine pas, et je suis toujours aussi mauvais pour trouver ce genre d'informations.
    Merci à toi, excellent week-end,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. Gestion globale des erreurs
    Par claire_S dans le forum Struts 2
    Réponses: 5
    Dernier message: 20/04/2009, 12h24
  2. Gestion personnalisée des erreurs
    Par Immobilis dans le forum Général Dotnet
    Réponses: 14
    Dernier message: 05/10/2008, 01h20
  3. Gestion propre des erreurs
    Par Titi41 dans le forum ASP.NET
    Réponses: 11
    Dernier message: 29/05/2008, 18h37
  4. gestion personnaliser des erreurs PHP
    Par pascalbout1 dans le forum Langage
    Réponses: 2
    Dernier message: 10/12/2007, 17h39
  5. Réponses: 3
    Dernier message: 21/10/2006, 23h46

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