2017-02-21 100 views
0
def errorCheck(daySales): 
    while True: 
    try: 
     daySales = float(daySales) 

    except ValueError: 
     print('Please only enter a number - for example: 7') 
     print('Try again!') 
    except Exception as err: 
     print('Unknown error - please contact the programmer!') 
     print(type(err)) 

    return(float(daySales))  

counter=0 
day = ['Monday','Tuesday','Wednesday','Thursday', 
     'Friday','Saturday','Sunday'] 
daySales=() 
sales=[] 
totalsales=[] 

for i in range(len(day)): 
    print('Enter sales for ' + day[i] + ': ', end="") 
    daySales = input() 
    errorCheck(daySales) 
    sales = sales + [float(daySales)] 

for i in range(len(day)): 
    print('\nYour sales for ' + day[i] + ' were: $', sales[i], end="") 

print('\nWhich equates to a weekly sales total of: $' ,end="") 
sumOfList = sum(sales) 
print(sumOfList) 

如果用戶輸入數字,該腳本完全符合我的要求,但是如果發生異常,它會捕獲它,但會繼續執行下一步。例如,如果我爲星期一的銷售輸入「foobar」,腳本會告訴我只輸入一個數字,然後轉到下一個輸入,即星期二。 我怎樣才能使我的循環留在'一天',直到用戶輸入一個有效的號碼?Python3錯誤處理循環

+1

你有一個'while'循環,但是無論輸入/異常,你都在做'return'。如果沒有異常,你只想「返回」。你也希望得到循環中的'input()'。否則,用戶將如何輸入另一個值? –

回答

1

的直接回答是包裹在一個while循環輸入/校驗序列:

unchecked = True 
while unchecked: 
    daySales = input() 
    errorCheck(daySales) 

注意,目前你的代碼的結構方式,在errorCheck返回float(daySales)將確保一個將引發異常。

現在讓我們來解釋一下代碼中的其他非常奇怪的東西。從頂部讀取:

  1. 有一個while循環errorCheck。它永遠不會運行一次以上,因爲它包含return
  2. errorCheck的回報將觸發之前被捕獲和報告的任何異常。如果發生異常,可以用None返回。上面顯示的循環可以依靠此檢查。
  3. counter從不使用。 totalSales也不是。
  4. input接受你試圖以print作爲參數的內容。
  5. for i in range(len(day)):可替換爲for d in day:。這意味着day[i]在循環中變爲d
  6. 同一表單的第二個循環可以變成for d, s in zip(day, sales):
  7. 字符串更適合通過格式化而不是通過+添加。

這裏是清理代碼會是什麼樣子:

def errorCheck(daySales): 
    try: 
     return float(daySales) 
    except ValueError: 
     print('Please only enter a number - for example: 7') 
     print('Try again!') 
    except Exception as err: 
     print('Unknown error - please contact the programmer!') 
     print(type(err)) 
    return None 

day = ['Monday','Tuesday','Wednesday','Thursday', 
     'Friday','Saturday','Sunday'] 
sales=[] 

for d in day: 
    daySales = None 
    while daySales is None: 
     daySales = input('Enter sales for {}:'.format(d)) 
     daySales = errorCheck(daySales) 
    sales.append(daySales) 

for d, s in zip(day, sales): 
    print('\nYour sales for {} were: ${}'.format(d, s)) 

sumOfList = sum(sales) 
print('\nWhich equates to a weekly sales total of: ${}'.format(sumOfList)) 
+0

謝謝!這真的很有幫助。櫃檯和totalSales是從我正在嘗試做的事情剩下的。我剛剛開始學習Python,所以你使用的一些東西我們還沒有涉及,但我在for循環中的while循環內部提供了錯誤檢查的觀點。 –

+0

玩弄這個,這比我嘗試做的方式更有意義,特別是使用'for d in day'而不是'for i in range ...'必須查看zip()功能,這也是一個非常酷的功能! –

+0

很高興爲你解決。繼續練習 –

-1

把你return(float(daySales))在else語句。所以只有在try成功時纔會運行。

+0

真實的陳述,但回答op的問題幾乎沒有。這應該是一個評論。 –

+0

@MadPhysicist我當時沒有名氣發表評論,對此抱歉。 – jarcobi889