上QQ阅读APP看书,第一时间看更新
2.14.4 主动抛出异常
有一些情况在代码层面是没有问题的,但是在业务逻辑层面有严重的问题,在这种情况下我们可以主动地、显式地抛出异常。
比如,在统计学生成绩的时候,我们可以用浮点数来接收用户的输入。–10是一个合法的整数值,在代码层面完全没有问题,但是在业务逻辑和应用场景来看就有问题,为什么学生的成绩会是负数?最差的情况不就是零分吗?当这种情况发生的时候,我们可以主动抛出异常。
points = [88, 90, 95, -2, 100] for point in points: if point < 0: raise Exception('Point must be >= 0, but "{}" is not'.format(point))
执行结果如下:
Exception: Point must be >= 0, but "-2" is not
异常抛出的语法部分并不难,难点在于错误信息的编写和错误类型的确定。异常信息需要用心写,让人清晰地知道为什么出错。
我们可以看以下两个异常信息,比较优劣。
Exception: Point must be >= 0, but "-2" is not Exception: Illegal point
异常信息在一定程度上具有代码注释的作用,会在错误排查的时候起到关键作用。但是,很多程序员在写代码的时候没有花心思把异常信息写得更具体,导致在后续排查错误的时候更多的精力耗费,这实在是得不偿失。
异常类型需要用心选择,不要一味地用最常见的Exception类型(这在项目实践中是普遍存在的现象),而是需要尽可能准确地反映错误的类型。
Exception: Point must be >= 0, but "-2" is not ValueError: Point must be >= 0, but "-2" is not
异常类型的选择和错误信息的设计,都是为了能更清晰、更准确地描述出现的问题,让后续的调试排查能更快、更精准地定位问题,从而提高解决问题的效率。这是体现在代码之外的软实力,是成为优秀的工程师必须具备的能力和习惯。