我有一个叫做“学生”的课程。这将创建一个基本的学生对象,其中包含完成GPA所需的一切。我已经添加了两种分别处理成绩点和字母等级的方法,然后计算出GPA。我的问题是,如果他们输入的字母等级不可接受(即G或X),最好的方法和位置是添加错误处理。我会在方法本身中这样做,还是在程序中调用它更合适?
class Student:
def __init__(self, name, hours, qpoints):
self.name = name
self.hours = float(hours)
self.qpoints = float(qpoints)
def get_name(self):
return self.name
def get_hours(self):
return self.hours
def get_qpoints(self):
return self.qpoints
def gpa(self):
return self.qpoints / self.hours
def add_grade(self, grade_point, credit_hours):
self.qpoints += grade_point * credit_hours
self.hours += credit_hours
def add_letter_grade(self, grade_letter, credit_hours):
letter_grades = {
'A': 4.0,
'B': 3.0,
'C': 2.0,
'D': 1.0,
'F': 0.0
}
grade_point = letter_grades.get(grade_letter)
self.qpoints += grade_point * credit_hours
self.hours += credit_hours
def main():
new_student = Student('Mike Smith', 0, 0)
while True:
usr_input = input('Please enter the student course information'
' (grade and credit hours) separated'
' by a comma <q to quit>: ')
if usr_input == 'q':
break
else:
grade, hours = usr_input.split(',')
if grade.isalpha():
new_student.add_letter_grade(grade, float(hours))
else:
new_student.add_grade(float(grade), float(hours))
print('{0}\'s final GPA was {1:.2f}'.format(new_student.get_name(), new_student.gpa()))
if __name__ == '__main__':
main()
答案 0 :(得分:3)
grade_point = letter_grades.get(grade_letter)
这是您应该触发错误的地方。
我会将letter_grades.get(grade_letter)
更改为letter_grades[grade_letter]
。让它引发一个KeyError,然后渗透到调用者。
在主循环中捕获异常,
try:
new_student.add_letter_grade(grade, float(hours))
except KeyError:
print("That looks like a letter grade, but we don't know what it means. Ignoring it.")
```
答案 1 :(得分:2)
类应易于扩展。你的类应该处理错误,但也要抛出一个错误,以便将来利用该类的人知道他们输入失败的原因。
在Python中,这被称为raise
例外。你的班级方法应该优雅地#34;如果在内部引发异常,则失败,并返回raise
它自己的异常。谁利用该类负责管理该类抛出的异常。
Here是另一篇与同一主题相关的帖子。
答案 2 :(得分:1)
这完全取决于您的使用模式。谁写了调用程序?这个界面有什么假设?
我的默认做法是让方法以验证输入参数开始。这使得该方法可以与其他各种应用程序共享。
然而,重要的是要确保检查在一端或另一端发生。两者都非常优于两者。
这有帮助吗?