2016-10-28 4 views
1

두 가지 예외를 제기해야하는 클래스 할당 작업을하고 있습니다. 첫 번째 예외 : 사용자 입력이 0보다 작거나 100보다 큰 경우 예외를 발생시키고 처리해야합니다. 그러면 코드에서 사용자에게 다시 숫자를 묻습니다.파이썬 코드가 try/except 절을 건너 뜁니다.

두 번째 예외 : 특정 파일을 찾을 수없는 경우 예외가 파일 이름을 요청한 후 다시 검색합니다.

두 경우 모두 예외를 발생시킬 수 없습니다. 즉, 첫 번째 예외에서 100보다 작거나 0보다 작은 숫자를 입력하면 프로그램이 계속 진행되고이 항목에 대해 아무 것도 기록하지 않습니다. 사용자의 항목을 인쇄하면 except 절이 표시해야하는 오류 메시지가 아니라 "none"이됩니다. 마찬가지로 두 번째 예외에서 파일을 찾을 수없는 경우 코드는 예외를 발생시키기보다는 단순히 실행을 중지합니다.

수동으로 예외를 발생 시키려고 시도했지만 (이 question/answer), 원하지 않는 추적을 만듭니다. 오류 메시지를 인쇄하고 함수를 호출하고 요청할 첫 번째 예외를 원합니다. 함수를 입력하고 호출하십시오.

첫째 예외 :

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

두 번째 예외 : 첫 번째 하나

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) 

답변

0

, 당신은 당신의 논리를 생각하고 당신을 위해 그것을 제기하지 않습니다 파이썬으로 수동으로 인상해야합니다.

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

두 번째 호출의 경우 두 번째 호출에서 값을 반환해야합니다. 대신 return displayGrades(allStudents)을 사용하십시오.

+0

들여 쓰기를 수정할 수 있습니까? 또한,'IOError'는 여전히 파이썬 3의 OSError와 동의어로 존재합니다. – tdelaney

+0

고마워요. 제 텍스트 북은 입출력을 사용합니다. 그러나 나는 더 자주 사용되는 용어를 사용하고 싶습니다. – momExMachina

+0

Shady Atef,이 코드를 구현할 때 오류 메시지와 새 번호 요청을 수신합니다. 그러나 이전 코드에서와 똑같은 일이 발생합니다 : 새 번호가 반환되지 않고 인쇄되면 "none"으로 표시됩니다. – momExMachina

1

연습 문제는 raise 예외이며 처리 할 수 ​​있습니다. 당신은 정말 계속보다는 재귀 루프, 예컨대 :

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 

필요하지만 예외가 정말이 경우에 필요하지 않는 한이 예외의 목적을 위해 고안된 것입니다. 일반적으로 예외가 잡힐 것 - 나는 동일한 기능의 인수 전달하고 사용자의 입력을 혼합주의 할 비록

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

: 다운 스트림 기능을 제외하고, 예를 제기하기 때문에 다른 예를 들어

이 덜 인위적인입니다 사용자가 원래 파일 이름을 제공하는 위치에서 처리됩니다. 따라서이 예제에서는 호출 함수가 될 것입니다.

+0

첫 번째가 고안된 것에 동의하지만 이는 숙제 지정에만 해당됩니다.두 번째에 대한주의를 주셔서 감사합니다. 그러나 과제는 "예외로 인해 프로그램에서 정확한 파일 이름을 묻는 메시지가 나타납니다."- 프로그램에서 이전에 이미 지정되었지만 사용자가 아니라 파일 이름이 필요합니다. 감사합니다 – momExMachina