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

 Delphi Discussion :

Gestion des exceptions imbriquée dans des Try et boucle


Sujet :

Delphi

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Gestion des exceptions imbriquée dans des Try et boucle
    Bonjour

    Après toute sorte de manip, je n'arrive pas à éviter un message d'erreur direct du système.

    Une histoire de gestion des exceptions, mais imbriquée dans un autre Try et dans une boucle.

    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
     
    [...]
    var
      StListSource: TStringList;                    
      iSource: Integer;
    begin
      if FileExists(Form1.PathJournal) then
      begin
        StListSource := TStringList.create;
        Try
          StListSource.LoadFromFile(Form1.PathJournal);
          for iSource := 0 to StListSource.Count - 1 do
          BEGIN
    //TRY
            if Pos('Date', StListSource.Strings[iSource]) > 0 then
            begin
              ShowMessage('OK passage par là...'); /// exit;
    TRY
              if not Pos('opti', StListSource.Strings[iSource - 8]) > 0 then 
    EXCEPT           
    on EconvertError do
    MessageDlg('Erreur : Vous devez bla bla bla...', mtError, [mbOk], 0);
    END;
            end;
     
          END;
        Finally
          StListSource.free;
        end;
      end;
    end;
    En principe le Except récolte l'erreur juste au dessous de la portion de code délicate.

    Mais j'ai toujours la boite d'erreur suivante : "Indice de Liste hors limite (-1)"

    Je suis certain que la ligne coupable c'est "iSource - 8" = car à "- 7" ça passe sans problème.

    Bref, si vous avez une meilleure idée, merci de vos lumières.

    @+

    PS : Je précise que je test ensuite hors EDI...

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 254
    Points
    25 254
    Par défaut
    Pourquoi tu fais -8 ?
    C'est une particularité de ta donnée ?
    évidemment si 'Date' est présent dans une ligne entre 0 et 7, lorsque tu vas tester l'absence de 'opti', 8 lignes plus tôt cela ne va pas fonctionner !
    n'oublie pas que les lignes sont de 0 à n-1 !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    EXCEPT           
      on EconvertError do 
        MessageDlg('Erreur : Vous devez bla bla bla...', mtError, [mbOk], 0);
      on EListError do
       Beep;
    END;

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Hello Shai

    Pourquoi tu fais -8 ?
    C'est une particularité de ta donnée ?
    Disons que je scan un texte sur des portions récurrentes de données.

    Mais il se peut qu'il y ait des lignes qui sont absentes pour x raison.

    Bref ce - 8 correspond à ma base sur la recherche de "Date", et "opti" doit se trouver exactement au niveau - 8 au dessus de "date".

    Et si no "opti" à ce niveau =

    J'ai remplacé le couple Except End de ton code, mais toujours pareil (hors EDI) ; tout est ok, sauf lors de l'appel de la proc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [...]
            if Pos('Date', StListSource.Strings[iSource]) > 0 then
            begin
              ShowMessage('OK passage par là...'); /// exit;
    TRY
              if not Pos('opti', StListSource.Strings[iSource - 8]) > 0 then
    EXCEPT           
      on EconvertError do 
        MessageDlg('Erreur : Vous devez bla bla bla...', mtError, [mbOk], 0);
      on EListError do
       Beep;
    END; 
    [...]
    @+

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Perso, j'inverserai la recherche: D'abord sur opti puis sur Date (en vérifiant que l'occurence de opti se situe au minimum sur la 8° ligne).

    Ton code est incomplet ? Car cette construction me parait étrange:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if not Pos('opti', StListSource.Strings[iSource - 8]) > 0 then
      // then quoi donc ?
    EXCEPT           
      on EconvertError do 
        MessageDlg('Erreur : Vous devez bla bla bla...', mtError, [mbOk], 0);
      on EListError do
       Beep;
    END;


    @+ Claudius

  5. #5
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Salut Claude

    Perso, j'inverserai la recherche: D'abord sur opti puis sur Date (en vérifiant que l'occurence de opti se situe au minimum sur la 8° ligne).
    C'est que hors de cette proc, j'avais tenté de testé directo, justement en regardant sir la 8° ligne en amont était présente.

    Je pensais avoir trouvé la solution, bah oui aucun code complexe, simplement un test sur l'existence ou non de cette fichue ligne + entre le coupe Try / Except.

    Mais idem = toujours la même erreur hors EDI.

    Ton code est incomplet ? Car cette construction me parait étrange:
    je me suis également fait cette remarque, mais si j'ajoute ce 'then' C'est que Mister EDI me le réclame afin d'ensuite se compiler les doigts dans le nez. Si pas de then = niet compil...

    A vrai dire, je suis pour l'instant encore assez maladroit avec la gestion des exceptions avec boucles et autres Try

    J'ai même des doutes quant au pouvoir d'intercepter cette erreur précise...

    J'ajoute que c'est un évènement en Form1 qui pointe vers la proc (ici super simplifiée) en question qui est située dans un Unité spéciale sans Form.

    Et lors de plantage avec EDI actif, j'ai un message d'erreur qui est pointé sur ma Form1 = au niveau d'un Case Of (juste sous la procédure d'appel).

    Mais je suis absolument certain de la cause ; elle se situe au niveau de la "recherche" de la ligne -8 (car - 7 = OK).

    J'ai testé sous toutes les coutures, et tout est concordant, aucun doute là dessus.

    Un coup de bol, car des fois, la mise du doigt sur le truc qui coince, n'est pas toujours évident.

    @+

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 758
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 758
    Points : 13 354
    Points
    13 354
    Par défaut
    Et pourquoi ne contrôles-tu pas iSource >= 8 avant ton test

  7. #7
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,
    Citation Envoyé par Droïde Système7 Voir le message
    A vrai dire, je suis pour l'instant encore assez maladroit avec la gestion des exceptions avec boucles et autres Try
    Et si tu t'en passais.

    Ce code ne serait pas tout simplement suffisant ?
    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
    var
      StListSource: TStringList;
      iSource: Integer;
    begin
      if FileExists(Form1.PathJournal) then
      begin
        StListSource := TStringList.create;
        try
          StListSource.LoadFromFile(Form1.PathJournal);
          for iSource := 8 to StListSource.Count - 1 do
          begin
            if Pos('Date', StListSource.Strings[iSource]) > 0  then
            begin
              if Pos('opti', StListSource.Strings[iSource - 8]) > 0 then
                AppelDeMaProc;
              else
              begin
                MessageDlg('Erreur : Vous devez bla bla bla...', mtError, [mbOk], 0);
                Break;
              end;
            end;
          end;
        finally
          StListSource.Free;
        end;
      end;
    end;
    [EDIT]
    Citation Envoyé par HAL
    Et pourquoi ne contrôles-tu pas iSource >= 8 avant ton test
    +1
    C'est bien ce que je pense. Autant éviter un try/except si ce n'est pas nécessaire.
    @+

  8. #8
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Salut les copains,

    Hé bien... ouffff !

    Claude, impec ton astuce de tester par bloc de 8 lignes et non d'envoyer direct toute la sauce.

    J'ai un peu pataugé pour intégrer tes modifs dans ma proc entière.

    Mais j'ai testé sous toutes les coutures et le message d'erreur se déclenche si le "- 8" n'existe pas.

    Super et un grand merci et bravo

    Je pensais pourtant qu'un try/except était indispensable, ou un Raise.

    à Tous.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/04/2012, 16h41
  2. Réponses: 5
    Dernier message: 09/09/2011, 23h07
  3. Réponses: 0
    Dernier message: 10/09/2009, 17h48
  4. Réponses: 4
    Dernier message: 03/10/2006, 13h55
  5. Présentation dans des listes imbriquées
    Par Ghusse dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 29/09/2005, 09h35

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