2016-12-30 43 views
1

我創建了一個小小的python函數,它提供了一個簡單的檢查:參數n是一個自然數嗎?你將如何完成這項檢查?檢查自然數,通過assertRaise驗證異常

這是我創建的代碼:

def is_natural_number(n, print_err_msg=True): 
    try: 
     if not isinstance(n, int): 
      raise TypeError("Your input is not of integer type.") 
     if n < 1: 
      raise ValueError("Your integer is less than 1.") 
    except (TypeError, ValueError) as err: 
     result = False 
     if print_err_msg: 
      print("Error: {}".format(err)) 
    else: 
     result = True 
    finally: 
     return result 

我使用Python 3.5。我想確保此函數始終返回TrueFalse,並在必要時處理異常。就個人而言,我不認爲這個代碼是不錯的,有以下原因:

  1. 我不知道它是否適合把return語句轉換成finally塊。代碼工作正常,因爲它總是返回TrueFalse。但是,我不確定是否通過使用finally這樣造成了一些不良副作用。

  2. 我無法驗證TypeErrorValueError使用assertRaisesunittest。但是,assertRaises在從try塊中刪除TypeErrorValueError併成功處理這些異常後成功。我如何使用assertRaises驗證在try塊內通過raise引發異常時是否會引發異常?

回答

0

您的函數不會引發異常。

有兩種例外情況可以提出來的功能,但由於他們每個人都立即引起,沒有什麼是它提出,所以沒有什麼爲assertRaises趕上。

這是我會怎麼寫你的函數:

def is_natural_number(n): 
    return isinstance(n, int) and n > 0 

如果代碼中調用is_natural_number()並不需要知道爲什麼它返回False,然後也不做單元測試;他們只需要知道它是否有效。不要過分複雜的事情!

除外:將您的return聲明放入finally子句中對於原始代碼是多餘的。 finally是即使try子句中的例外是不是在except條款,這是不是在你的功能的情況下陷入了必須執行的代碼(如果不是TypeErrorValueError之外的異常是在try子句中出現,result在任何情況下都是未定義的,所以當你試圖返回時你會得到一個異常)。