【问题标题】:Best place to add error handling for objects?为对象添加错误处理的最佳位置?
【发布时间】:2015-09-15 17:15:35
【问题描述】:

我有一个名为“Student”的类,它创建了一个基本的学生对象,其中包含完成 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()

【问题讨论】:

  • 我投票结束这个问题,因为“我的代码有效,我该如何改进它”更适合 CodeReview.stackexchange.com
  • @TessellatingHeckler 更适合另一个站点并不是一个有效的关闭理由,因为迁移首先需要问题不在此处。标准的“过于宽泛”或“基于意见”的理由更适合接近投票;-)

标签: python class python-3.x


【解决方案1】:
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.")

```

【讨论】:

    【解决方案2】:

    类应该易于扩展。您的班级应该处理错误,但也应该抛出一个错误,以便将来使用该班级的人准确地知道他们的输入失败的原因。

    在 Python 中,这称为raise 异常。如果在内部引发异常,您的类方法应该“优雅地”失败,并返回 raise 自己的异常。使用该类的人负责管理该类引发的异常。

    Here 是另一个与同一主题相关的帖子。

    【讨论】:

    • 非常感谢先生!
    【解决方案3】:

    这完全取决于您的使用模式。谁编写调用程序?这个界面存在哪些假设?

    我的默认做法是让方法从验证输入参数开始。这使得该方法可以共享给各种其他应用程序。

    但是,重要的是确保检查发生在一端或另一端。两者都比两者都更可取。

    这有帮助吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 2018-09-12
      • 2017-11-26
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多