2017-06-21 6 views
0

Dies ist ein einfaches Abrechnungsprogramm, das die Bezahlung mit Überstunden berechnet.Warum der Traceback-Fehler mit einer try/exception rekursive (?) Funktion?

Mein Ziel war es, try/except und def neu zu starten, wenn Buchstaben anstelle von Zahlen eingegeben werden.

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() 

Wenn ich beim ersten Versuch Zahlen eintrage, läuft es einwandfrei. Wenn ich eingegebenen Buchstaben beginnt es über in Ordnung, aber wenn es hat, und ich dann Eingabe von Zahlen, es wird erfolgreich ausgeführt und die Anzeige zu bezahlen, sondern durch einen Rückverfolgungs und ein Wert Fehler gefolgt:

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' 

Wie kann ich interpretieren der Fehler? Und was kann ich tun, um das Problem zu beheben?

+0

Benötigen Sie eine Return-Anweisung am Ende der beiden Ausnahme Klauseln –

Antwort

0

In der except-Klausel, müssen Sie zurückkommen:

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

Andernfalls, sobald Ihre innere Abrechnungszurückkehrt, Sie mit dem Rest des Programms fortsetzen wird.

Hinweis: Ich würde diese Art der Programmierung auch nicht empfehlen. Es erstellt unnötige Stacks, und wenn Sie Fehler protokollieren usw., wird es wirklich schwer zu folgen, Bot für Sie, und für andere Teammitglieder durch die Stack-Trace.

Wenn Sie über Rekursion lernen, sollten Sie nach "Tail-Recursion" suchen, was eine effiziente Form der Rekursion ist. Leider wird es von Python nicht unterstützt.

+0

danke für die Hilfe. 'return' erlaubte tatsächlich, dass das Programm erfolgreich ausgeführt wurde. verwendet 'while' und 'break' statt 'def' und 'return' lösen das unnötige Stack-Problem? Mein Code wird in einem Kommentar unten veröffentlicht. danke – bradyrob

+0

Ja, genau. Die Art, wie Sie es getan haben, ist viel besser als die Rekursion Version. In Sprachen wie Python ist es viel besser, Rekursion in Iteration zu übersetzen, wenn es möglich ist. Sie können 'hrs = float (hrs)' direkt in Ihre 'try'-Klausel einfügen. Die doppelten Konvertierungen sind nicht erforderlich. – ssm

0

In einer weiteren Iteration des Programms habe ich 'while' und 'break' anstelle von 'def' und 'return' verwendet, um die gleichen Ergebnisse zu erzielen.

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)