2016-10-28 4 views
1

私は2つの例外を発生させる必要があるクラス割り当てに取り組んでいます。 最初の例外:ユーザーの入力が0より小さいか100より大きい場合、例外を発生させて処理することになっています。このコードは、ユーザーに再度数字を尋ねる必要があります。Pythonコードがtry/except節をスキップします

2番目の例外:特定のファイルが見つからない場合、例外はファイル名を要求してから、再度検索が行われます。

どちらの場合でも、例外を発生させることはできません。言い換えれば、最初の例外を除いて、100桁以上0桁未満の数字を入力すると、プログラムは続行され、このエントリには何も記録されません。ユーザーのエントリを表示すると、except節に表示されるエラーメッセージではなく、 "none"と表示されます。同様に、2番目の例外では、ファイルが見つからない場合、コードは単に例外を発生させるのではなく実行を停止します。

私は手動で例外を発生させようとしましたが(この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() 

2番目の例外:

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

あなたの最初のもののために、あなたはPythonがあなたのロジックを推測し、あなたのためにそれを上げないので、手動でそれを調達する必要があります。

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

2番目の呼び出しでは、2番目の呼び出しで値を返す必要があります。 の代わりにreturn displayGrades(allStudents)を使用してください。displayGrades(allStudents)

+0

インデントを修正できますか?また、 'IOError'はPython 3の' OSError'の同義語としてまだ存在しています。 – tdelaney

+0

私のテキストブックはIOを使用してくれてありがとうが、もっと一般的な言葉を使っています。 – momExMachina

+0

Shady Atef、このコードを実装すると、エラーメッセージと新しい番号の要求が表示されます。しかし、前のコードと同じことが起こります。新しい番号は返されず、印刷されると「なし」と表示されます。 – 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

私は最初のものが考案されていることに同意しますが、それは宿題に固有です。2番目に注意していただきありがとうございますが、もう一度、割り当ては "例外がプログラムに正しいファイル名を要求するようにすべきです"と言います。ファイル名はプログラムで前に指定されていますが、ユーザーによっては指定されていません。どうもありがとう – momExMachina

関連する問題