2016-10-28 1 views
1

Ich arbeite an einer Klassenzuordnung, in der ich zwei Ausnahmen auslösen muss. Erste Ausnahme: Ich soll eine Ausnahme auslösen und behandeln, wenn ein Benutzereintrag kleiner als 0 oder größer als 100 ist. Der Code sollte dann den Benutzer erneut nach der Ziffer fragen.Python-Code überspringt try/except-Klausel

Zweite Ausnahme: Wenn eine bestimmte Datei nicht gefunden wird, fordert die Ausnahme den Dateinamen an und die Suche wird erneut ausgeführt.

In beiden Fällen kann ich die Ausnahme nicht passieren. Mit anderen Worten, wenn in der ersten Ausnahme eine Ziffer eingegeben wird, die größer als 100 oder kleiner 0 ist, fährt das Programm fort und zeichnet einfach nichts für diesen Eintrag auf. Wenn ich den Benutzereintrag drucke, erhalte ich "none" anstelle der Fehlermeldung, dass die except-Klausel angezeigt werden sollte. Wenn in der zweiten Ausnahme die Datei nicht gefunden wird, stoppt der Code einfach die Ausführung, statt die Ausnahme auszulösen.

Ich habe versucht, manuell eine Ausnahme auslösen (wie in diesem question/answer), aber das erstellt eine Traceback, die ich nicht will-- Ich möchte nur die erste Ausnahme die Fehlermeldung drucken und eine Funktion aufrufen und die zweite anfordern Eingabe und Aufruf einer Funktion.

Erste Ausnahme:

def grade(): 
    #input student's average grade 
    avgGrade = int(input("Enter average grade: ")) 
    try: 
     if avgGrade > 0 and avgGrade < 100: 
      return avgGrade 
    except ValueError: 
     print("Grade must be numeric digit between 0 and 100") 
     grade() 

Zweite Ausnahme:

def displayGrades(allStudents): 
    try: 
     #open file for input 
     grade_file = open(allStudents, "r") 

     #read file contents 
     fileContents = grade_file.read() 

     #display file contents 
     print(fileContents) 

     grade_file.close() 

    except IOError: 
     print("File not found.") 
     allStudents = input("Please enter correct file name: ") 
     displayGrades(allStudents) 

Antwort

0

Für Ihre ersten, haben Sie es als Python manuell erhöhen wird Ihre Logik erraten und es für Sie zu erhöhen.

def grade(): 
    #input student's average grade 
    avgGrade = int(input("Enter average grade: ")) 
    try: 
     if avgGrade > 0 and avgGrade < 100: 
      return avgGrade 
     else: 
      raise ValueError()  
    except ValueError: 
     print("Grade must be numeric digit between 0 and 100") 
     return grade() 

Für die zweite, müssen Sie den Wert im zweiten Aufruf zurückgeben. Verwendung return displayGrades(allStudents) statt displayGrades(allStudents)

+0

Können Sie Ihren Einzug korrigieren? "IOError" existiert immer noch als Synonym für 'OSError' in Python 3. – tdelaney

+0

Danke für den Kopf, mein Lehrbuch benutzt IO, aber ich würde lieber den Begriff verwenden, der häufiger ist. – momExMachina

+0

Shady Atef, wenn ich diesen Code implementieren, erhalte ich die Fehlermeldung und die Anfrage nach einer neuen Nummer. Aber dann passiert das Gleiche wie bei meinem vorherigen Code: Die neue Nummer wird nicht zurückgegeben und beim Ausdruck als "keine" angezeigt. – momExMachina

1

Klingt wie die Übung raise die Ausnahme ist und damit umgehen. Sie müssen wirklich eine Schleife für die Fortsetzung statt Rekursion, z.B .:

def grade(): 
    while True: 
     try: 
      avgGrade = int(input("Enter average grade: ")) 
      if avgGrade < 0 or avgGrade > 100: 
       raise ValueError() 
     except ValueError: 
      print("Grade must be numeric digit between 0 and 100") 
      continue # Loop again 
     break # Exit loop 
    return avgGrade 

Aber das ist für den Zweck der Ausnahme gekünstelt, als Ausnahmen sind nicht wirklich in diesem Fall benötigt.

Für Ihr weiteres Beispiel ist dies weniger gekünstelt, da die nachgeschaltete Funktion die Ausnahme, zB aufwirft:

def displayGrades(allStudents): 
    while True: 
     try: 
      with open(allStudents, "r") as grade_file: 
       ... 
     except IOError: 
      allStudents = input("Please enter correct file name: ") 
      continue 
     break 

Obwohl ich beiläufig und Benutzereingaben in der gleichen Funktion Misch arg warnen würde - in der Regel die Ausnahme gefangen werden würde und behandelt, wo der Benutzer ursprünglich den Dateinamen angibt. In diesem Beispiel wäre es wahrscheinlich die aufrufende Funktion.

+0

Ich stimme zu, dass die erste ist erfunden, aber es ist spezifisch für die Hausaufgabe.Danke für die Vorsicht auf der zweiten, aber wieder, die Anweisung sagt "Ausnahme sollte dazu führen, dass das Programm nach dem korrekten Dateinamen fragt" - der Dateiname wurde bereits früher im Programm angegeben, aber nicht vom Benutzer. Vielen Dank – momExMachina