什么是最有效的方式来处理Python中的错误?

问题描述:

我是Python新手,我试图处理错误,但我不知道最有效的方式来处理Python中的错误。我以这种方式尝试过,但看起来有点复杂。我认为可能存在一些其他“更好”的方式来处理它。什么是最有效的方式来处理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

而不是'if else'用'try''去除' – 0TTT0

你可以尝试把它写这样

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 

倒置的逻辑来简化代码:

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 

由于raise将自动取消该功能的其余部分的执行,在有条件加注之后出现的任何代码都可以假定条件不适用,因此您不需要else语句。

+0

但是在处理erros时没有try-catch语句更具说服力吗?似乎if-else语句不是这个的“最佳”选项。 –

+0

@ÁtilaDiasdaGamaeSilva尽管标题中使用了“句柄”这个词,但书写的问题是关于引发异常,而不是捕捉它们。 – Amber