我是初学程序员,正在编写一个程序,将字母等级转换为GPA,或GPA转换为用户输入的字母等级。我引用了两个函数来执行其他程序中的转换。我正在使用try语句开始假设它是一个转换为GPA的字母等级,并且我没有工作,我尝试将函数从GPA转换为字母等级。
我的程序有效,唯一的问题是我的else语句总是执行,即使我输入的内容不是字母等级或GPA。我猜这很容易,我没有看到。
#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 :(得分:0)
您可以在try catch中使用else语句。但是,请查看文档建议如何使用try catch else。 Catch应该出错。你应该弄清楚你想要捕获什么样的错误。
https://docs.python.org/3/tutorial/errors.html
您可以做的另一件事是使用调试器来查看您在每个块中获得的内容。只需将以下代码放入要检出的块中即可:
导入pdb; pdb.set_trace()
答案 1 :(得分:0)
您的内部try-except
会吞下任何异常,这意味着即使gpa_converter
引发异常,最外层try
套件仍然会“成功”,因此{{1} }子句将执行。
有几种方法可以解决这个问题,但涉及最少量重构的方法可能是在最里面的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: ')
答案 2 :(得分: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
所以你不会错过你可能不知道的错误。