为什么使用 try/except 递归(?)函数会出现回溯错误?
Why the traceback error with a try/except recursive(?) function?
这是一个计算加班费的简单工资单程序。
我的目标是在输入字母而不是数字时使用 try
/except
和 def
重新开始。
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)
这是一个计算加班费的简单工资单程序。
我的目标是在输入字母而不是数字时使用 try
/except
和 def
重新开始。
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)