为什么使用 try/except 递归(?)函数会出现回溯错误?

Why the traceback error with a try/except recursive(?) function?

这是一个计算加班费的简单工资单程序。

我的目标是在输入字母而不是数字时使用 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()

如果我第一次尝试输入数字,它会完美执行。 如果我输入字母,它开始时一切正常,但一旦输入,然后我输入数字,它会成功执行并显示 pay,但随后会出现回溯和值错误:

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'

如何解释错误?我该怎么做才能解决这个问题?

在except子句中,需要return:

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

否则,一旦您的内部工资单 returns,您将继续该计划的其余部分。

注意:我也不推荐这种形式的编程。它会创建不必要的堆栈,如果您正在记录错误等,那么对于您和查看堆栈跟踪的其他团队成员来说,它真的很难跟进。

如果您正在学习递归,您应该查找 "tail-recursion" 这是一种有效的递归形式。不幸的是 Python.

不支持它

在程序的进一步迭代中,我使用 '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)