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 :

Le traitement de l'erreur ne passe pas dans «Except»


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut Le traitement de l'erreur ne passe pas dans «Except»
    Bonjour à tous,

    Un "truc" inexplicable et qui ne m'est en tout cas jamais arrivé.
    Voici le code :
    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
    Function TMainForm.IsFileInZipFile(ZipFile : String; FilesList : TStringList;
                                       Mask : Boolean) : Boolean;
    Var
      i, j : Integer;
      MaskStrList : TStringList;
    Begin
      Result := False;
      ZipMaster := TZipmaster.Create(Nil);
      if FileExists(ZipFile) then
      begin
        try
          ZipMaster.ZipFileName := ZipFile;
         except
           ShowMessage(ZipFile + ' n''est pas un fichier zip valide.');
           exit
          end;
          .....
          .....
    Malgré l'erreur renvoyée par le composant TZipmaster
    This archive is not a valid Zip archive
    ,
    l'exécution ne passe pas dans le bloc "Except".
    Il passe bien dans un "Finally" mais l'erreur se déclenche dans la procédure appelante avant que le message de la fonction n'apparaisse.
    L'erreur ne provient pas du nom du fichier mais bien d'un fichier .zip corrompu.
    Une idée ?
    Accessoirement, je voudrais que le message de TZipmaster ne s'affiche pas.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 252
    Points
    41 252
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    Juste indiquer le nom du fichier au composant ZIPMaster (propriété ZipFileName) suffirait à lancer la vérification
    AMHA il manque une instruction après le renseignement de la propriété, mais je ne connais pas ce composant pour l'affirmer

    [Edit] ah si, dans l'aide il est indiqué
    NOTE: When you assign a value to this property, the contents of the zipfile will be read.

  3. #3
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Je crois que tu peux gérer l'erreur sans try ... avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ZipMaster.ErrCode <> 0 then

  4. #4
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Sergio Master, quand le fichier archive (*.zip) est endommagé ou corrompu,l'exception est bien déclenchée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZipMaster.ZipFileName := ZipFile;
    Mais le bloc Except n'est pas pris en compte.

    ALWEBER, comme l'affectation de ZipFileName provoque l'erreur, aucune instruction qui suivrait comme ZipMaster.Err ou ZipMaster.Find ne peut être prise en compte.

    Quand je double clique sur le fichier corrompu dans l'explorateur de Windows 10, une boite à message s'affiche avec le message
    Windows ne peut pas ouvrir le dossier.
    Le fichier compressé «Fichier.zip» n'est pas valide.
    J'ai essayé de tester le fichier corrompu en utilisant l'API Windows.
    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
    procedure TMainForm.Test2Click(Sender: TObject);
    Var
      dwread :LongWord;
      hFile : THandle;
      data : Shortstring;
      ZipFile : String;
    begin
      ZipFile := 'D:\Cadastre\Matrice2010ZippéEtDézippé\00423972.zip';
      hFile := createfile(PChar(ZipFile), GENERIC_READ, FILE_SHARE_READ, Nil,
                          OPEN_EXISTING, 0, 0);
      SetFilePointer(hFile, 0, nil, FILE_BEGIN);
      Readfile(hFile, data, 64, dwread, nil);
      ShowMessage(SysErrorMessage(GetLastError));
      Closehandle(hFile);
    end;
    Mais le message qui m'est renvoyé est
    L'opération a réussi.

  5. #5
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour,

    on ne peut pas gerer toutes les exceptions avec un bloc "try/except"
    ça dépend principalement du choix du développeur initial (voir la petite démo)
    et après un rapide tour dans les sources de ZipMaster cela semble être le cas ici
    ils ont fait le choix d'afficher ce genre de message.
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    procedure TestException1;
    var
      SL           : TStringList;
    begin
      SL := TStringList.Create;
      try
        try
          SL.LoadFromFile('tt.ttt');
        except
          // je laisse le choix au programmeur
          raise;
        end;
      finally
        SL.Free;
      end;
    end;
     
    procedure TestException2;
    var
      SL           : TStringList;
    begin
      SL := TStringList.Create;
      try
        try
          SL.LoadFromFile('tt.ttt');
        except
          // je décide de forcer l'affichage de l'erreur
          on E: Exception do
            ShowMessageFmt('Message forcé'#13#10' %s', [E.Message])
        end;
      finally
        SL.Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      try
       // je peux choisir d'afficher cette erreur ou de l'étouffer
        TestException1;
      except
        on E: Exception do
          ShowMessageFmt('Message intercepté'#13#10' %s', [E.Message]) // ce message sera affiché
      end;
     
      try
        // ici je n'ai pas le choix
        TestException2;
      except
        on E: Exception do
          ShowMessageFmt('Message intercepté'#13#10' %s', [E.Message]) // ce message ne sera pas affiché
      end;
    end;
    Cordialement,

    @+

  6. #6
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    J'ai galéré dans les sources du composant pour suivre le cheminement des instructions qui empêchaient de masquer le message d'erreur mais j'y suis finalement arrivé grâce à Cirec que je remercie.

    Je clos donc le sujet.

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

Discussions similaires

  1. VBA ne passe pas dans BO xi-r2
    Par faressam dans le forum Administration-Migration
    Réponses: 10
    Dernier message: 27/06/2008, 14h10
  2. Ma requête SQL SELECT ne passe pas dans next()
    Par Somato dans le forum Bases de données
    Réponses: 17
    Dernier message: 02/06/2008, 15h45
  3. pourquoi je ne passe pas dans mon action
    Par fk04 dans le forum Struts 1
    Réponses: 5
    Dernier message: 03/10/2007, 21h20
  4. Ctrl -] ne passe pas dans une console avec vim
    Par Celelibi dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 10/03/2006, 13h35
  5. Réponses: 8
    Dernier message: 26/10/2005, 03h52

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