2017-02-21 83 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