2016-09-12 8 views
0

私は初心者のプログラマーであり、ユーザーが入力した文字グレードをGPAまたはGPAから文字グレードに変換するプログラムを作成しています。私は他のプログラムで変換を行うために2つの関数を参照しています。私はGPAに変換する文字グレードであると仮定して開始するtry文を使用していますが、GPAから文字グレードに変換する関数を試しても動作しません。ネストされたtry elseステートメントの問題

私のプログラムは動作しますが、唯一の問題は、文字のグレードやGPAではないものを入力しても、私のelse文は常に実行されることです。私はそれが私が見ていないことは簡単だと推測しています。

#Convert a letter grade to GPA, or GPA to letter grade 

from grade_points_to_letter import gpa_converter 
from letter_grade_to_grade_point import letter_converter 

grade = input('Enter a letter grade or GPA to convert: ') 

while grade != '': 
    try: 
     grade = grade.upper() 
     conversion = letter_converter(grade) 
     try: 
      conversion = gpa_converter(float(grade)) 
     except: 
      print('You did not enter a valid letter grade or GPA') 
    except: 
     pass 
    else: 
     print('Your converted grade is:', conversion) 
    grade = input('Enter a letter grade or GPA to convert: ') 
+0

私はelse文がtry \ except文で使われるとは思わないと思います。 –

+0

try文がうまくいけば、else文は実行されることになっています。 – DntMesArnd

+0

これは 'try'ブロックがエラーを投げないことを意味します。私が見ることができる唯一の場所は 'letter_converter'です。あなたはそこに何を持っていますか? – kaveh

答えて

0

あなたの内側のtry-exceptgpa_converterは、例外が発生した場合でも、最も外側のtryスイートは、まだ「成功」になりますので、else句が実行されることを意味し、すべての例外を飲み込むします。

これを修正するにはいくつかの方法がありますが、リファクタリングを最小限に抑える方法は、おそらく最も内側のexcept節で例外を再発生させることです。

while grade != '': 
    try: 
     grade = grade.upper() 
     conversion = letter_converter(grade) 
     try: 
      conversion = gpa_converter(float(grade)) 
     except: 
      print('You did not enter a valid letter grade or GPA') 
      raise 
    except: 
     pass 
    else: 
     print('Your converted grade is:', conversion) 
    grade = input('Enter a letter grade or GPA to convert: ') 

編集:無効な入力上の機能によって発生した例外をキャッチしようとしている場合

while grade != '': 
    grade = grade.upper() 

    try: 
     conversion = letter_converter(grade) 
    except Exception: 
     try: 
      conversion = gpa_converter(float(grade)) 
     except Exception: 
      print('You did not enter a valid letter grade or GPA') 
     else: 
      print('Your converted grade is:', conversion) 
    else: 
     print('Your converted grade is:', conversion)    

    grade = input('Enter a letter grade or GPA to convert: ') 
0

try catchでtry文を使用できます。ただし、try catch elseを使用してドキュメントの推奨方法をチェックアウトしてください。キャッチはエラーになります。あなたはどのような種類のエラーを捕まえたいのか把握する必要があります。あなたが行うことができます

https://docs.python.org/3/tutorial/errors.html

もう一つは、あなたが各ブロックに取得しているものを見るためにデバッガを使用しています。チェックアウトしたいブロックに次のコードを入力してください:

import pdb; pdb.set_trace()

0

、:さて、あなたのコメントをオフに基づいて、あなたが実際にのために行っていることは、このようなものです

while grade != '': 
    try: 
     grade = grade.upper() 
     conversion = letter_converter(grade) 
    except: 
     try: 
      conversion = gpa_converter(float(grade)) 
     except: 
      print('You did not enter a valid letter grade or GPA') 
      conversion = None 
    if conversion: 
     print('Your converted grade is:', conversion) 

また、予想される例外、例えば を指定することをお勧めします:おそらくあなたは、このような何かにコードを書き直したい

except(TypeError, ValueError): 
    pass 

だから気づかないかもしれないバグを見逃すことはありません。

関連する問題