2017-06-21 30 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)