2017-07-27 87 views
-1

我有一個函數可以處理整數。如果輸入了字符串或浮點數,我添加了異常處理代碼,但是Python不斷返回廢話或NameError。在這一點上,我嘗試了一個循環,不斷詢問,直到輸入一個整數,然後輸入tryexcept。什麼都沒有即使有異常處理,Python函數也會返回NameError

下面的代碼:

def threes(num): 

    """isNotCorrect = True 

    while isNotCorrect: 
     print(type(num)) 
     if type(num) is not int: 
      print("Sorry, you need to enter a whole number to play Threes.") 
     else: 
      print('X') 
      isNotCorrect = False""" 

    try: 
     while num > 1: 
      if num % 3 == 0: 
       num = num/3 
      else: 
       if ((num + 1) % 3 == 0): 
        num = (num + 1)/3 
       else: 
        num = (num - 1)/3 
      print(num) 
    except NameError: 
     print("Invalid number. Please enter a valid number.") 

輸入一個整數(預期輸入)的罰款執行的代碼,但一切導致名稱錯誤這樣,該輸入是threes(bob)。最上面的部分是我的循環嘗試,它也失敗並返回相同的錯誤;

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
NameError: name 'bob' is not defined 
+2

看來你還沒有定義bob變量......你可以發佈entiere代碼嗎? – Darkaird

+1

當你打電話給'三分線(bob)'而'bob'沒有在任何地方定義時,你期望什麼? – Tomalak

+1

該方法執行前引發異常('bob'不存在)。通過不輸入方法,'try'' except'不被執行。另外,如果你想檢查輸入是一個數字,'Except'應該檢查'TypeError',而不是'NameError'。 – AArias

回答

0

NameError: name 'bob' is not defined意味着你嘗試使用一個名爲bob的變量,但是你沒有創建它。
你必須定義什麼是bob這樣的爲例:
bob = 'a simple man' # bob is a string

bob = 4 # bob is an integer

而且,我只是想讓你知道,即使它的工作原理,儘量避免使用try /除外,因爲這當你必須輸入除了區域時,它非常慢。

如果您要檢查,如果你的變量是一個整數,我建議你使用:

if isinstance(bob, int): 
    # do something 
else: 
    # do something else 

isinstance()是一個內置的功能。

+0

很好的建議。如果異常事實上沒有得到提升,例外情況會比等效的「if ... else」代碼快,但如果您希望異常時間超過5-10%,那麼代碼運行速度會更快它使用'if ... else'代碼。然而,使用'isinstance'比使用'type'好這種東西。 –

+0

@PM 2Ring是的,我忘了'isinstance',我編輯過。 關於'try ... except',我會補充一點,即使它小於5-10%(但不是很少),我更喜歡'if ... else',因爲它更加穩定和可預測可以用於多處理目的(例如)。 – Darkaird

0

你的bob變量沒有定義,所以你沒有達到try/catch。

嘗試decalring鮑勃與非數字bob = 'test_string'並重試。

0

問題是NameError正在從以外調出這個函數。當你說:

threes(bob) 

什麼Python做是:

  1. 獲取的bob值。
  2. 致電threes傳遞該值作爲參數。

NameError在步驟1中引發,因此您甚至不會進入該功能。如果你還是想抓住它,你應該有外try/except塊:

try: 
    threes(bob) 
except NameError: 
    print("NameError raised.") 
0

您發佈簡單的代碼不能引發NameError。該錯誤可能來自您稱之爲threes函數的部分。如果您只寫了threes(bob),那麼如果先前未定義名爲bob的變量,則會引發NameError。如果你想傳遞一個字符串,你應該調用你的函數,如:threes("bob")

相關問題