2017-06-21 32 views
0

這是一個簡單的工資計劃,計算加班工資。爲什麼使用try/except遞歸(?)函數追蹤錯誤?

我的目標是使用try/exceptdef重新開始,如果輸入字母而不是數字。

def payroll(): 
    hrs = input("Enter Hours:") 
    try: 
     hrs = int(hrs) 
    except: 
     print('ERROR: use numbers, not letters to write numbers. start over') 
     payroll() 
    h = float(hrs) 
    #r = float(rate = input("enter rate:")) <= nested doesn't work 
    rate = input("enter rate:") 
    try: 
    rate = int(rate) 
    except: 
     print('ERROR: use numbers, not letters to write numbers. start over') 
     payroll() 
    r = float(rate) 
    paylow = r*h 
    if h <= 40: pay = paylow 
    else: pay = 40*r+r*1.5*(h-40) 
    print("pay: $",pay) 
payroll() 

如果我在第一次嘗試時輸入數字,它會完美地執行。 如果我輸入的字母就開始了罰款,但一旦有,我再輸入數字,它會成功執行和顯示的薪酬,但隨後回溯和值誤差:

Enter Hours:g 
ERROR: use numbers, not letters to write numbers. start over 
Enter Hours:5 
enter rate:5 
pay: $ 25.0 
Traceback (most recent call last): 
    File "tryexcept.py", line 24, in <module> 
    payroll() 
    File "tryexcept.py", line 11, in payroll 
    h = float(hrs) 
ValueError: could not convert string to float: 'g' 

我該如何解讀錯誤?我能做些什麼來解決這個問題?

+0

感謝您的幫助,在除了從句 –

回答

0

在except子句,你需要返回:

except: 
    print('ERROR: use numbers, not letters to write numbers. start over') 
    payroll() 
    return 

否則,一旦你內心的工資回報,你會繼續與該程序的其餘部分。

注:我也不會推薦這種形式的編程。它會創建不必要的堆棧,並且如果你記錄錯誤等,它將很難跟隨,爲你而動,以及其他團隊成員通過堆棧跟蹤進行查看。

如果你正在學習遞歸,你應該查找「尾遞歸」,這是一種有效的遞歸形式。不幸的是,它不被Python支持。

+0

的末尾都需要return語句。 'return'確實允許程序成功運行。 是否使用'while'和'break'而不是'def'和'return'來解決不必要的堆棧問題?我的代碼發佈在下面的評論中。 謝謝 – bradyrob

+0

確實如此。你做這件事的方式比遞歸版本要好得多。在像Python這樣的語言中,如果可能的話,將遞歸轉換爲迭代要好得多。您可以考慮直接在'try'子句中執行'hrs = float(hrs)'。沒有必要進行雙重轉換。 – ssm

0

在程序的進一步迭代中,我利用「while」和「break」而不是「def」和「return」來實現相同的結果。

while True: 
    hrs = input("Enter Hours:") 
    try: 
     hrs = int(hrs) 
     break 
    except: 
     print('ERROR: use numbers, not letters to write numbers. try again') 
h = float(hrs) 
while True: 
    rate = input("enter rate:") 
    try: 
     rate = int(rate) 
     break 
    except: 
     print('ERROR: use numbers, not letters to write numbers. try again') 
r = float(rate) 
paylow = r*h 
if h <= 40: pay = paylow 
else: 
    print("overtime pay alert!") 
    pay = 40*r+r*1.5*(h-40) 
print("pay: $",pay)