基础代谢率计算/基础代谢率计算(4)

去社区提问

简介:基础代谢率计算器4.0版本,解决程序的异常处理问题。

案例描述

欢迎来到今天的课堂~

之前的几节课程中,我们完成了基础代谢率计算的任务,并且对程序的输入输出等进行了进一步优化。

但程序依然存在一些小小的问题,例如有些‘不走寻常路’的用户,可能会输入这样的信息:

‘男 一米七五 七十五 二十’

这样的中文形式不能被计算机所识别处理为数字,用于后续的基础代谢率计算。就会出现下面的结果:

除此之外,还有些可爱的用户会这样输入:

‘男 175’

当没有输入完整信息时,运行程序会出现下面的状况。

上面提到的这两种情况都会导致程序遇到错误,无法正常运行。但这些情况很有可能是用户不经意间造成的,就好像我们使用计算机的时候突然出现蓝屏情况,用户看到这种情况肯定一头雾水。

当这些状况是我们可以提前预见的时候,可不可以采取一些操作,防止程序出现这种‘令人崩溃’的画面呢?

今天这节课,就跟我一起来了解Python的异常处理机制

案例分析

引入异常处理机制可以解决程序运行时的错误。

利用它可以把我们能预想发生错误的情况列举出来,再给每种情况设置解决策略。

就好比我养了一只小猫咪,带回家之前就预感它可能会给我带来各种各样的麻烦,于是提前想好了一系列解决方案。

如果小猫咪不好好吃饭,就给它换上准备好的其它品牌猫粮;

如果小猫咪不好好睡觉,总半夜跑酷,就给它一个小玩偶陪它睡觉。

上面的两种情况都是我推测可能会出现的状况,所以提前准备了对应的解决方案。

Python异常处理机制的基本语法是:

其中try是’尝试‘的意思,也就是在这里写上我们判断可能出现异常的代码;

后面的except就是预想到不同的错误原因,以及对应解决方案。

如果把它带入到前面小猫咪的例子中,则应该写为:

  1. try:
  2. 领养一只小猫咪回家
  3. except 不好好吃饭:
  4. 换其他品牌猫粮
  5. except 不好好睡觉:
  6. 给它一个玩偶安慰

除此之外,可能还有一些我们预料不到的特殊状况,会导致异常发生,需要有一个统一方案来解决,就可以用最后的except:来处理。

  1. try:
  2. 领养一只小猫咪回家
  3. except 不好好吃饭:
  4. 换其他品牌猫粮
  5. except 不好好睡觉:
  6. 给它一个玩偶安慰
  7. except:
  8. 抱抱小猫

现在你大概明白Python异常处理机制的解决方法了吗?

当程序遇到try语句时,先尝试执行try中包含的代码块,如果没有错误,就可以顺利执行try-except结构后面的语句;如果发生错误,Python就寻找一个符合该错误的异常语句,执行相应except下的处理方案。

对照上面小猫咪的例子,我们可以解决基础代谢率运算程序可能出现的异常问题。

首先需要定位可能出现异常错误的代码段。

根据前面的预判,用户可能输入‘七十五’这样的文字内容,那么问题就会出在字符串分割后的类型转换过程中。

假如用户输入的数据不齐全,例如只输入了’男 75’两项性别和体重信息,那么从拆分后的列表中,把字符串分配给身高、年龄就会出现错误。

总的来说,执行下面这段代码时,程序有可能抛出异常。

  1. gender = str_list[0]
  2. weight = float(str_list[1])
  3. height = float(str_list[2])
  4. age = int(str_list[3])

把这段代码放进try的怀抱中,我们再来为它解决可能出现的一个个问题。

首先解决输入数据无效的小麻烦,还记得报错信息提示的内容吗?我们再来回顾一下。

当传入无效的参数时,程序就会抛出ValueError异常。文字形式的字符串无法转换为浮点数,因此在运行到下面这行代码时就会报ValueError异常:

为了解决这个问题,需要用到前面讲解过的try-except结构。

except后面跟着错误的类型,下一行是该类型错误的解决方法。这里的错误类型当然就是ValueError,为了不让程序执行到这里报错,我们打印出‘请输入正确的信息!’这句提示语。

  1. except ValueError:
  2. print('请输入正确的信息!')

当输入的信息数量不足时,程序会报下面的错误:

当程序试图对列表进行索引操作时,如果索引超出了取值范围,就会报出IndexError。我们依然希望打印一行提示语句来告知用户这个问题。

有了上面的铺垫,相信你应该清楚如何完成下面两行代码的书写。

  1. except IndexError:
  2. print('输入的信息过少!')

对于其它我们暂时无法预知的错误,也给出一个统一的解决方案:

  1. except:
  2. print('程序异常')

下面一起来看下我们目前的代码吧~

  1. y_or_n = input('是否退出程序(y/n)?')
  2. while y_or_n != 'y':
  3. print('请输入以下信息,用空格分割')
  4. info = input('性别 体重(kg) 身高(cm) 年龄:')
  5. str_list = info.split(' ')
  6. try:
  7. gender = str_list[0]
  8. weight = float(str_list[1])
  9. height = float(str_list[2])
  10. age = int(str_list[3])
  11. except ValueError:
  12. print('请输入正确的信息!')
  13. except IndexError:
  14. print('输入的信息过少!')
  15. except:
  16. print('程序异常!')
  17. if gender == '男':
  18. # 男性
  19. bmr = (13.7 * weight) + (5.0 * height) - (6.8 * age) + 66
  20. elif gender == '女':
  21. # 女性
  22. bmr = (9.6 * weight) + (1.8 * height) - (4.7 * age) + 655
  23. else:
  24. bmr = -1
  25. if bmr != -1:
  26. print('您的性别:{},体重:{}公斤,身高:{}厘米,年龄:{}岁'.format(gender, weight, height, age))
  27. print('您的基础代谢率:{}大卡'.format(bmr))
  28. else:
  29. print('暂不支持该性别')
  30. print() # 输出空行
  31. y_or_n = input('是否退出程序(y/n)?')

看起来好像没什么问题,但是让我们来仔细思考一下这段程序执行的逻辑,就会发现,哎?好像是有哪里不太对劲。

当程序执行到try里面的代码块时,如果没有遇到错误,就跳过try-except,直接执行后面的内容,这里没有任何问题;但是按照现在的写法,当try后面的代码块出现错误后,执行对应错误except语句中的解决方案,打印出信息后,我们会惊奇地发现,程序依然会往下执行if条件判断。

因此,我们需要把条件判断的操作也放进try下面的代码块中:

  1. y_or_n = input('是否退出程序(y/n)?')
  2. while y_or_n != 'y':
  3. print('请输入以下信息,用空格分割')
  4. info = input('性别 体重(kg) 身高(cm) 年龄:')
  5. str_list = info.split(' ')
  6. try:
  7. gender = str_list[0]
  8. weight = float(str_list[1])
  9. height = float(str_list[2])
  10. age = int(str_list[3])
  11. if gender == '男':
  12. # 男性
  13. bmr = (13.7 * weight) + (5.0 * height) - (6.8 * age) + 66
  14. elif gender == '女':
  15. # 女性
  16. bmr = (9.6 * weight) + (1.8 * height) - (4.7 * age) + 655
  17. else:
  18. bmr = -1
  19. if bmr != -1:
  20. print('您的性别:{},体重:{}公斤,身高:{}厘米,年龄:{}岁'.format(gender, weight, height, age))
  21. print('您的基础代谢率:{}大卡'.format(bmr))
  22. else:
  23. print('暂不支持该性别')
  24. except ValueError:
  25. print('请输入正确的信息!')
  26. except IndexError:
  27. print('输入的信息过少!')
  28. except:
  29. print('程序异常!')
  30. print() # 输出空行
  31. y_or_n = input('是否退出程序(y/n)?')

现在来运行程序看看结果~

本关总结

本节课我们一起学习了Python的异常处理机制,它的基本语法是:

当程序遇到try语句时,先尝试执行try中包含的代码块,如果没有错误,就可以顺利执行try-except结构后面的语句;如果发生错误,Python就寻找一个符合该错误的异常语句,执行相应except下的处理方案。

下节预告

下节课我们将学习编程中一个非常重要的概念:函数。利用函数能让程序更加模块化,也可以增加程序的可读性~期待一下。

想获取课程资料,和更多同学一起交流学习,欢迎添加班主任老师微信。

扫描二维码添加班主任微信

已经添加过班主任的同学,可以直接联系对应老师,无需重复添加哦。

基础代谢率计算 1/3

基础代谢率计算(4)

1.0x

恭喜完成本课时的学习!
坚持学习

行动力超过

累计学习

学习下一课时