2017-10-10 10 views
1

Je suis novice en python et j'essaie de gérer les erreurs, mais je ne connais pas la façon la plus efficace de gérer les erreurs dans python. J'ai essayé de cette façon, mais cela semble un peu complexe à comprendre. Je pense que peut exister une autre "meilleure" façon de le gérer.Quelle est la manière la plus efficace de gérer les erreurs dans python?

def set_bit(value, pos, nbits): 
""" 
Set bit at position. 

Keyword Arguments 
    value (int) 
     Bitstring value. 
    pos (int) 
     Position to set bit. 
    nbits (int) 
     Number of bits. 
""" 
if isinstance(value, int): 
    if value > -1: 
     # Positives only 
     if isinstance(pos, int): 
      if pos > -1: 
       if isinstance(nbits, int): 
        if nbits > -1: 
         return get_bistring(value | 2 ** (pos % nbits), nbits) 
        else: 
         raise ValueError(
          '"nbits" was set {}, but it must be positive only' 
          .format(nbits) 
         ) 
       else: 
        raise TypeError(
         '"nbits" was set {}, but it must be int only' 
         .format(type(nbits)) 
        ) 
      else: 
       raise ValueError(
        '"pos" was set {}, but it must be positive only' 
        .format(pos) 
       ) 
     else: 
      raise TypeError(
       '"pos" was set {}, but it must be int only' 
       .format(type(pos)) 
      ) 
    else: 
     raise ValueError(
      '"value" was set {}, but it must be positive only' 
      .format(value) 
     ) 
else: 
    raise TypeError(
     '"value" was set {}, but it must be int only' 
     .format(type(value)) 
    ) 
+1

au lieu de 'if else' aller avec' try' 'except' – 0TTT0

Répondre

2

Vous pouvez essayer d'écrire comme ça

import sys 

try: 
    f = open('myfile.txt') 
    s = f.readline() 
    i = int(s.strip()) 
except OSError as err: 
    print("OS error: {0}".format(err)) 
except ValueError: 
    print("Could not convert data to an integer.") 
except: 
    print("Unexpected error:", sys.exc_info()[0]) 
    raise 
2

Inverser votre logique pour simplifier votre code:

def set_bit(value, pos, nbits): 
    """ 
    Set bit at position. 

    Keyword Arguments 
     value (int) 
      Bitstring value. 
     pos (int) 
      Position to set bit. 
     nbits (int) 
      Number of bits. 
    """ 
    if not isinstance(value, int): 
     raise TypeError('"value" was set {}, but it must be int only'.format(type(value))) 
    if value < 0: 
     raise ValueError('"value" was set {}, but it must be positive only'.format(value)) 
    if not isinstance(pos, int): 
     raise TypeError('"pos" was set {}, but it must be int only'.format(type(pos))) 
    # and so on... 

    # once you finish all your checks, then do what you planned to do 

Depuis raise annule automatiquement l'exécution du reste de la fonction , tout code qui vient après une relance conditionnelle peut supposer que la condition ne s'applique pas, donc vous n'avez pas besoin d'instructions else.

+0

Mais les instructions try-catch n'ont-elles pas été plus plausives lors du traitement des erreurs? Il semble que les instructions if-else ne soient pas la meilleure option pour cela. –

+0

@ ÁtilaDiasdaGamaeSilva malgré le mot «gérer» dans le titre, la question telle que écrite est sur le fait de soulever des exceptions, ne pas les attraper. – Amber