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

Python Discussion :

Exception IndexError et troncature des indices slicés


Sujet :

Python

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut Exception IndexError et troncature des indices slicés
    Bonjour,

    Je dois analyser des chaines de caractères correspondant à des trames de données. Les trames étant normalisées, je peux connaitre les positions de variables à récupérer dans la chaine. Ces chaines sont de longueurs variables et certaines variables de la chaine donnent la taille de ce qu'il y a derrière.

    Lors de mon analyse, j'ai voulu jouer avec les exceptions. Voici un morceau de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                # rsp est un indice calcule precedemment et verifie comme ne generant pas d'exception IndexError
                try:
                    print "response", self.rawdata[rsp+2:rsp+4]
                    self.dest_data_len = int(self.rawdata[rsp+2:rsp+4], 16)
                    self.dest_data = self.rawdata[rsp+4:rsp+4+self.dest_data_len*2]
                    self.dest_crc = self.rawdata[rsp+4+self.dest_data_len*2:rsp+4+self.dest_data_len*2+2]
                except IndexError:
                    print "[Frame] Impossible d'analyser la reponse du destinataire"
    Le problème est que, je cite la documentation :
    exception IndexError

    Raised when a sequence subscript is out of range. (Slice indices are silently truncated to fall in the allowed range; if an index is not a plain integer, TypeError is raised.)
    et donc mes exceptions ne servent à rien si la chaine est plus petite que prévue. Comment contourner ce problème ? Je pourrais faire une tentative d'accès à l'indice maximum avant de lire la plage mais c'est quand même très contraignant... Auriez-vous une technique efficace à me proposer svp ?

    Merci d'avance !

  2. #2
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Au pif, je dirais...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                errno = 0
                length = len(self.rawdata)
                if length <= rsp+4:
                    errno = 1 #ou raise IndexError("bla bla bla...")
                print "response", self.rawdata[rsp+2:rsp+4]
                self.dest_data_len = int(self.rawdata[rsp+2:rsp+4], 16)
                if (length <= rsp+4+self.dest_data_len*2):
                    errno = 1 #ou raise IndexError("bla bla bla...")
                self.dest_data = self.rawdata[rsp+4:rsp+4+self.dest_data_len*2]
                if (length <= rsp+4+self.dest_data_len*2+2):
                    errno = 1 #ou raise IndexError("bla bla bla...")
                self.dest_crc = self.rawdata[rsp+4+self.dest_data_len*2:rsp+4+self.dest_data_len*2+2]
                if errno:  #ou un except IndexError couple de son try.
                    print "[Frame] Impossible d'analyser la reponse du destinataire"
    Le 14 vient de l'accumulation
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'avais effectivement pensé à cette solution, tester avant chaque lecture. C'est un peu dommage mais je vais devoir faire avec on dirait

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 135
    Points
    135
    Par défaut
    Pour éviter d'alourdir la syntaxe, tu peux empaqueter le test et le slice dans une fonction ou créer une classe qui hérite de list et surcharge le slice

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    L'idée de faire une fonction est pas mal, surtout que j'ai lu que Python proposait des nested functions et des fonctions lambdas (encore jamais regardé ces 2 machins...). Je vais regarder de ce côté. Merci

Discussions similaires

  1. exception en template avec des typeid
    Par Julien_C++ dans le forum Langage
    Réponses: 8
    Dernier message: 03/01/2007, 13h55
  2. Convertir des indices
    Par Mathusalem dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/06/2006, 10h12
  3. [Exceptions] Système de traitement des exceptions
    Par jenesuispasunrobot dans le forum Langage
    Réponses: 5
    Dernier message: 07/12/2005, 11h09
  4. [Exception] de l'utilisation des exceptions...
    Par Alec6 dans le forum Général Java
    Réponses: 7
    Dernier message: 16/09/2005, 17h53
  5. IBExpert : troncature des double precision ?
    Par Magnus dans le forum Outils
    Réponses: 1
    Dernier message: 25/08/2005, 15h07

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