2013-06-18 267 views
1

我有一個輸入端(稱爲names),以及輸入被分成三個部分(.split),然後將第三(最後)元件被轉換成整數並放入列表Python異常/ ValueError異常/錯誤處理

即例如names = "John Smith 3" 它被分成三個部分"John" "Smith" 3 並放入列表:list1 = ["John", "Smith", 3]

現在的問題是如果第三元件被輸入作爲一個字符串,並且不能被轉換成與整數("John Smith Three") ,我該如何去展示一個錯誤,並讓我們成爲一名成員呃重新輸入(名字),如果用戶輸入"John Jacob Smith 3"(超過三個元素),我該如何處理錯誤。

+0

到目前爲止你的代碼是什麼? –

回答

0

對於第一部分:一個簡單的這樣做的方法是:

try: 
    float(l[2]) 
except ValueError: 
    #error - bad input. user must re enter... 

對於第二部分:只是檢查從分割所形成的列表的長度。

+0

空白除了子句是一個壞主意。你應該明確要捕捉哪個異常。 –

+0

好點。我編輯了我的答案。 – Harry

1

2種方式去了解這一點:

這個古老,經典的嘗試捕捉方法:

message = 'Please enter ...' 
while(True): 
    print message 
    user_input = raw_input().split() 
    if len(user_input) != 3: 
     message = 'Incorrect number of arguments please try again' 
     continue 
    try: 
     num_value = int(user_input[2]) 
    except ValueError: 
     message = 'Incorrect int value' 
     continue 
    break 

另一種方法是簡單地使用正則表達式,它應該是這樣的:

import re  
regex = '^\s*(\w+)\s+(\w+)\s+(\d+)\s*$' 
p = re.compile(regex) 
print 'Please enter ...' 
while(True): 
    user_input = raw_input() 
    m = p.match(user_input) 
    if m: 
     value1 = m.group(1) 
     value2 = m.group(2) 
     int_value = int(m.group(3)) 
     break 
    else: 
     print 'Incorrect input format, it should be ...' 

不是說使用這個正則表達式,你可以匹配任何具有3個元素的字符串,這些元素由任意數量的空格分隔並以int值結尾。所以'a b 10'' a b 10 '都匹配。

2

我建議你問用戶兩個輸入:他/她的名字,然後是魔術數字。

如果你一定想從一個單一的輸入得到這個,你可以嘗試像這樣

while True: 
    name_and_num = raw_input("Your input: ") 
    parts = name_and_num.split() 
    try: 
     firstname, lastname, num = parts[0], parts[1], int(parts[2]) 
     break 
    except (IndexError, ValueError): 
     print "Invalid input, please try again" 

print firstname, lastname, num 
+0

不要忘記IndexError :),我不認爲你的代碼會引發TypeError。 –

+0

謝謝,對。 :)鑄造到int會導致參數None的TypeError,但在這裏永遠不會出現這種情況。 –

0

我更喜歡使用功能的一切:

def processNames(nameString): 
    namesList = nameString.split() 
    if len(namesList) == 3: 
    try: 
     namesList[2] = int(namesList[2]) 
    except: 
     print "Third item not an integer" 
     return None 
    else: 
    print "Invalid input" 
    return None 
    return namesList 

假設你有一個長長的清單名稱循環:

processed = [] 
for name in longList: 
    processed.append(processNames(name)) 

這將優雅地返回與Nones fille的項目列表d在不正確的條目中。