2017-10-10 63 views
1

我是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

回答

2

你可以嘗試把它寫這樣

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

倒置的邏輯來簡化代碼:

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

相關問題