嵌套的try else语句

时间:2016-09-12 01:21:50

标签: python

我是初学程序员,正在编写一个程序,将字母等级转换为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: ')

3 个答案:

答案 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

所以你不会错过你可能不知道的错误。